leetcode hot100刷題第四天

2021-10-23 06:18:54 字數 3698 閱讀 1049

二、搜尋旋轉排序陣列(leetcode-33)

三、在排序陣列中查詢元素第乙個和最後乙個位置(leetcode-34)

四、組合總和(leetcode-39)

五、接雨水(leetcode-42)

總結給定乙個只包含 『(』 和 『)』 的字串,找出最長的包含有效括號的子串的長度。

示例 1:

輸入: 「(()」

輸出: 2

解釋: 最長有效括號子串為 「()」

示例 2:

輸入: 「)()())」

輸出: 4

解釋: 最長有效括號子串為 「()()」

(1):暴力法:對字串所有非空偶數長度子字串判斷其是否為有效括號。

(2):動態規劃:定義乙個dp陣列,其中dp[i]表示以下標i為字串結尾的字串的最長有效括號長度,顯然可以知道』(『結尾的位置dp[i]應該為0,所以只用考慮』)『的情況,此時又分兩種情況:1、』)『前面的字元是』(』,這種情況比較簡單dp[i] = dp[i-2] + 2即可;2、』)『前面的字元也為』)『時,那麼字串就可能是』…))『的形式,此時我們往前找到乙個s[i-dp[i-1]-1] = 『(』,此時可以得出dp[i]=dp[i−1]+dp[i−dp[i−1]−2]+2。

(3)::此題可用棧經過一次遍歷得到答案,建立乙個棧之後將-1入棧,對於遇到的每個 『(』,我們將它的下標放入棧中。對於遇到的每個』)』,我們彈出棧頂的元素並將當前元素的下標與彈出元素下標作差,得出當前有效括號字串的長度。通過這種方法,我們繼續計算有效子字串的長度,並最終返回最長有效子字串的長度。

動態規劃:

public static int longestvalidparentheses(string s)  else if (i - dp[i - 1] > 0 && s.charat(i - dp[i - 1] - 1) == '(') 

maxans = math.max(maxans, dp[i]);}}

return maxans;

}

public static int longestvalidparentheses(string s)  else  else }}

return maxans;

}

假設按照公升序排序的陣列在預先未知的某個點上進行了旋轉。

( 例如,陣列 [0,1,2,4,5,6,7] 可能變為 [4,5,6,7,0,1,2] )。

搜尋乙個給定的目標值,如果陣列中存在這個目標值,則返回它的索引,否則返回 -1 。

你可以假設陣列中不存在重複的元素。

你的演算法時間複雜度必須是 o(log n) 級別。

示例 1:

輸入: nums = [4,5,6,7,0,1,2], target = 0

輸出: 4

示例 2:

輸入: nums = [4,5,6,7,0,1,2], target = 3

輸出: -1

因為題目要求時間複雜度為o(log n)級別,所以可以想到是用二分查詢進行解決,乙個無重複元素的旋轉排序陣列有兩種情況,一是首位元素大於中位元素,這樣陣列後半部分有序,然後比較target與中位元素大小再確定查詢區間,另一種情況類似。

public static int search(int nums, int target) 

int start = 0;

int end = nums.length-1;

int mid;

while(start <= end)

//前半部分有序時

if(nums[start] <= nums[mid]) else

}else else

}} return -1;

}

給定乙個按照公升序排列的整數陣列 nums,和乙個目標值 target。找出給定目標值在陣列中的開始位置和結束位置。

你的演算法時間複雜度必須是 o(log n) 級別。

示例 1:

輸入: nums = [5,7,7,8,8,10], target = 8

輸出: [3,4]

示例 2:

輸入: nums = [5,7,7,8,8,10], target = 6

輸出: [-1,-1]

本題如上題依舊採用二分查詢的方法,不過在遇到元素等於target時不是直接返回,而是不斷向左或者向右移動得到左右邊界再進行返回。

public static int searchrange(int nums, int target) ;

} int firstindex = find(true,nums,target);

int lastindex = find(false,nums,target);

return new int; }

//查詢第乙個和最後乙個元素

private static int find(boolean isfindfirst,int nums,int target)

else if(nums[mid]0 && nums[mid]==nums[mid-1]) else

}else

/*** @param candidates 陣列輸入

* @param len 輸入陣列的長度,冗餘變數

* @param residue 剩餘數值

* @param begin 本輪搜尋的起點下標

* @param path 從根結點到任意結點的路徑

* @param res 結果集變數

*/private void dfs(int candidates,

int len,

int residue,

int begin,

dequepath,

list> res)

for (int i = begin; i < len; i++)

path.addlast(candidates[i]);

dfs(candidates, len, residue - candidates[i], i, path, res);

path.removelast();}}

給定 n 個非負整數表示每個寬度為 1 的柱子的高度圖,計算按此排列的柱子,下雨之後能接多少雨水。

示例:輸入: [0,1,0,2,1,0,1,3,2,1,2,1]

輸出: 6

public int trap(int height) 

stackstack = new stack<>();

int ans = 0;

for (int i = 0; i < height.length; i++)

if (!stack.isempty())

}stack.add(i);

}return ans;

}

這次五個題感覺難度都比較大,不過從中也獲得了不少的收穫,看了看一些優秀的題解和分析,對二分查詢這種演算法左右邊界的尋找有了更深的理解。而且看了多種思路的解法後我感覺棧這種資料結構在演算法中有很多妙用,在以後刷題過程中需要多多總結。

LeetCode Hot 100 最長回文子串

新年的刷的第一題,題目如下 給你乙個字串 s,找到 s 中最長的回文子串。示例 1 輸入 s babad 輸出 bab 解釋 aba 同樣是符合題意的答案。示例 2 輸入 s cbbd 輸出 bb 示例 3 輸入 s a 輸出 a 示例 4 輸入 s ac 輸出 a 1 s.length 1000 ...

leetcode hot 100 分割等和子集

給定乙個只包含正整數的非空陣列。是否可以將這個陣列分割成兩個子集,使得兩個子集的元素和相等。注意 每個陣列中的元素不會超過 100陣列的大小不會超過 200 示例 1 輸入 1,5,11,5 輸出 true 解釋 陣列可以分割成 1,5,5 和 11 示例 2 輸入 1,2,3,5 輸出 false...

貝爾RG100A 刷機指南

網上看了很多教程,輪到自己試驗的時候總是有各種問題,現在總結下,以免後來忘記。首先,很重要的一點是本地pc必須設成192.168.1.這個網段,將pc網線插入rg100a的刷機埠 lan4燈亮即是 再次,按住reset鍵開機,會看見dsl的燈不斷閃爍,等到dsl燈滅了之後,就可以在ie 其他瀏覽器有...