本專題內容如下:
一、初始定義及原地修改
1.283. 移動零
2.27. 移除元素
3.26. 刪除排序陣列中的重複項
4.80. 刪除排序陣列中的重複項 ii
二、基礎思想應用
1.75. 顏色分類
2.88. 合併兩個有序陣列
3.215. 陣列中的第k個最大元素
4.167. 兩數之和 ii - 輸入有序陣列
5.209. 長度最小的子陣列
類似題目:
注意的問題
1.283. 移動零
給定乙個陣列nums
,編寫乙個函式將所有0
移動到陣列的末尾,同時保持非零元素的相對順序。
示例:
輸入: [0,1,0,3,12]
輸出: [1,3,12,0,0]
說明:
必須在原陣列上操作,不能拷貝額外的陣列。
儘量減少操作次數。
實現思路:
實現:
迴圈一次找出不為0的index,並將該index對應的值依次儲存到陣列中,後面的全部為0即可!
class solution
i++;
}return j;
}}
基本思想:
類似題目:
二分查詢法模板:
int l = 0, r = n-1; // 在[l...r]的範圍裡尋找target:前閉後閉
while( l <= r )
注意的問題
1.75. 顏色分類
給定乙個包含紅色、白色和藍色,一共 n 個元素的陣列,原地對它們進行排序,使得相同顏色的元素相鄰,並按照紅色、白色、藍色順序排列。
此題中,我們使用整數 0、 1 和 2 分別表示紅色、白色和藍色。
注意:
示例:
輸入: [2,0,2,1,1,0]
輸出: [0,0,1,1,2,2]
實現思路:
統計一次紅、白、黑的數量,然後再迴圈一次原地修改!
實現:
class solution else if((n1>=0 && n2>=0 && nums1[n1]=0))}}
}
3.215. 陣列中的第k個最大元素
在未排序的陣列中找到第k個最大的元素。請注意,你需要找的是陣列排序後的第 k 個最大的元素,而不是第 k 個不同的元素。
示例 1:
輸入: [3,2,1,5,6,4] 和 k = 2
輸出: 5
示例 2:
輸入: [3,2,3,1,2,4,5,5,6] 和 k = 4
輸出: 4
說明:
你可以假設 k 總是有效的,且 1 ≤ k ≤ 陣列的長度。
實現思路:
直接使用氣泡排序,當冒出k次後,此時的元素就是第k個最大元素。
實現:
class solution
public void quicksort(int nums,int left,int right)
int pivot = nums[left];
int i = left;
int j = right;
int temp;
while(i=pivot)
i++;
if (i最後交換快排
class solution
public void quicksort(int nums,int left,int right)
int pivot = nums[left];
int i = left;
int j = right;
int temp;
while(i=pivot)
i++;
if (i4.167. 兩數之和 ii - 輸入有序陣列
給定乙個已按照公升序排列的有序陣列,找到兩個數使得它們相加之和等於目標數。
函式應該返回這兩個下標值 index1 和 index2,其中 index1 必須小於 index2。
說明:
示例:
輸入: numbers = [2, 7, 11, 15], target = 9
輸出: [1,2]
解釋: 2 與 7 之和等於目標數 9 。因此 index1 = 1, index2 = 2 。
實現思路:
二分查詢法
實現:
注意二分查詢的**中左右可以相等!
class solution
}return res;
}public int binarysearch(int numbers, int start, int end, int target)else if(numbers[mid]> target)else
}return -1;
}}
5.209. 長度最小的子陣列
給定乙個含有n個正整數的陣列和乙個正整數s ,找出該陣列中滿足其和≥ s的長度最小的連續子陣列。如果不存在符合條件的連續子陣列,返回 0。
示例:
輸入: s = 7, nums = [2,3,1,2,4,3]
輸出: 2
解釋: 子陣列 [4,3] 是該條件下的長度最小的連續子陣列。
高階:
如果你已經完成了o(n) 時間複雜度的解法, 請嘗試 o(n log n) 時間複雜度的解法。
實現思路:
迴圈+二分
實現:
注意二分查詢的**中左右可以相等!
時間複雜度:o(nlogn),空間複雜度o(n)。
思路:將原先陣列所有數字累加求和得到乙個新陣列,例如:
nums=[2,3,1,2,4,3]
parnums=[0,2,5,6,8,12,15]
然後迴圈parnums,對每乙個陣列中的index對應的值,利用二分法找到最小的視窗。
舉個例子:
nums=[2,3,1,2,4,3]
parnums=[0,2,5,6,8,12,15]
--------------
i=0時
--------------
第一輪left=0,right=6
left7,
調整right=mid-1。
是不是上述可以看作是查詢7的二分法,那麼後面依次類推即可。
當然left調整也可以是left++,right調整也可以是right--,也可以ac,但是效率會低一些!
--------------
......
迴圈+二分
public class solution else}}
return min;
}}
C和指標詳解 陣列
8.1.1 陣列名int a int b 10 a是標量,b為陣列。在c中幾乎所有的陣列名的表示式中,陣列名的值是乙個指標常量,也就是陣列第乙個元素的位址。不過也不要根據這個得出陣列和指標是相同的結論。陣列具有一些何指標完全不同的特徵。例如,陣列具有確定數量的元素,而指標只是乙個標量。編譯器用陣列名...
詳解陣列中的reduce方法
這幾天面試被問到了陣列的方法有哪些,回答得簡直一塌糊塗,面試官說reduce的功能很強大,於是想對這個方法進行總結,在紅寶書中對這個方法的描述並不算多,我也是參考了其他文章才進行總結的,下面就開始吧 在紅寶書中,將這個方法定義為陣列的歸併方法,這個方法和迭代方法 map,foreach,filter...
詳解陣列reduce方法以及用法
一 語法 arr.reduce callback,initialvalue 這個方法接收兩個引數 1.要執行的函式 要執行的函式中也可傳入引數,分別為 prev 上次呼叫函式的返回值 cur 當前元素 index 當前元素索引 arr 被遍歷的陣列 2.函式迭代的初始值 例子 eg1 var arr...