給定乙個未排序的整數陣列,找出最長連續序列的長度。
要求演算法的時間複雜度為 o(n)。
示例:輸入: [100, 4, 200, 1, 3, 2]
輸出: 4
解釋: 最長連續序列是 [1, 2, 3, 4]。它的長度為 4。
給定 n 個非負整數表示每個寬度為 1 的柱子的高度圖,計算按此排列的柱子,下雨之後能接多少雨水。
上面是由陣列 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度圖,在這種情況下,可以接 6 個單位的雨水(藍色部分表示雨水)。 感謝 marcos 貢獻此圖。
示例:輸入: [0,1,0,2,1,0,1,3,2,1,2,1]
輸出: 6
思路1:統計每層的雨水數量。
整個思路就是,求第 i 層的水,遍歷每個位置,如果當前的高度小於 i,並且兩邊有高度大於等於 i 的,說明這個地方一定有水,水就可以加 11。
如果求高度為 i 的水,首先用乙個變數 temp 儲存當前累積的水,初始化為 00。從左到右遍歷牆的高度,遇到高度大於等於 i 的時候,開始更新 temp。更新原則是遇到高度小於 i 的就把 temp 加 11,遇到高度大於等於 i 的,就把 temp 加到最終的答案 ans 裡,並且 temp 置零,然後繼續迴圈。
也就是紅色區域中的水,陣列是 height = [ 0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1 ] 。
原則是高度小於 1,temp ++,高度大於等於 1,ans = ans + temp,temp = 0。
temp 初始化為 0,ans = 0
height[0] 等於 0 < 1,不更新。
height[1] 等於 1 >= 1,開始更新 temp。
height[2] 等於 0 < 1,temp = temp + 1 = 1。
height[3] 等於 2 >= 1,ans = ans + temp = 1,temp = 0。
height[4] 等於 1 >= 1,ans = ans + temp = 1,temp = 0。
height[5] 等於 0 < 1,temp = temp + 1 = 1。
height[6] 等於 1 >= 1,ans = ans + temp = 2,temp = 0。
剩下的 height[7] 到最後,高度都大於等於 1,更新 ans = ans + temp = 2,temp = 0。而其實 temp 一直都是 0,所以 ans 沒有變化。
再求第 2 行的水。
也就是紅色區域中的水,陣列是 height = [ 0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1 ]。
原則是高度小於 2,temp ++,高度大於等於 2,ans = ans + temp,temp = 0。
temp 初始化為 0,ans 此時等於 2。
height[0] 等於 0 < 2,不更新。
height[1] 等於 1 < 2,不更新。
height[2] 等於 0 < 2,不更新。
height[3] 等於 2 >= 2,開始更新
height[4] 等於 1 < 2,temp = temp + 1 = 1。
height[5] 等於 0 < 2,temp = temp + 1 = 2。
height[6] 等於 1 < 2,temp = temp + 1 = 3。
height[7] 等於 3 >= 2,ans = ans + temp = 5,temp = 0。
height[8] 等於 2 >= 2,ans = ans + temp = 3,temp = 0。
height[9] 等於 1 < 2,temp = temp + 1 = 1。
height[10] 等於 2 >= 2,ans = ans + temp = 6,temp = 0。
height[11] 等於 1 < 2,temp = temp + 1 = 1。
然後結束迴圈,此時的 ans 就是6。
class solution }}
return ans;
}public int getheight(int height)
return ans;
}}
思路3:在第二種方法上的改進,由於第二種方法每次需要求左右兩邊的最大值,我們可以預先求得放在乙個陣列裡,由於左右兩邊的最小高度和當前柱子的高度相等時也是沒有雨水數的,所以這裡我們選的左右兩邊最大值包括當前的柱子高度。
class solution
for(int i=1;iheight[i])
ans+=(min-height[i]);
}return ans;
}}
思路4:使用單調遞減棧來實現
class solution
st.push(cur);
cur++;
}return ans;
}}
給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。
請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o(log(m + n))。
你可以假設 nums1 和 nums2 不會同時為空。
示例 1:
nums1 = [1, 3]
nums2 = [2]
則中位數是 2.0
示例 2:
nums1 = [1, 2]
nums2 = [3, 4]
則中位數是 (2 + 3)/2 = 2.5
class solution else
}while(iarr[index++]=nums1[i++];
while(jarr[index++]=nums2[j++];
if(arr.length%2==0)else
}}
Leetcode128 題目總結 hard
the first missing positive 找第乙個丟失的整數 方法1 從1開始尋找正整數result 找到就把他交換到nums i 同時i回退到result 1,時間複雜度大於o n ac class solution else return result 方法2 對每乙個大於1的數nu...
leetcode 85 最大矩形 HARD
給定乙個僅包含 0 和 1 的二維二進位制矩陣,找出只包含 1 的最大矩形,並返回其面積。示例 輸入 1 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 0 0 1 0 輸出 6思路 以每一行為當前下邊界,求出各個列的高度 計算當前最大面積 呼叫leetcode84題maxrecarea...
leetcode 72 編輯距離 hard
給定兩個單詞 word1 和 word2,計算出將 word1 轉換成 word2 所使用的最少運算元 你可以對乙個單詞進行如下三種操作 插入乙個字元 刪除乙個字元 替換乙個字元 示例 1 輸入 word1 horse word2 ros 輸出 3 解釋 horse rorse 將 h 替換為 r ...