詳解陣列刷題上

2021-09-26 14:31:53 字數 4097 閱讀 8456

本專題內容如下:

一、初始定義及原地修改

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...