演算法刷題及總結 陣列篇

2021-10-25 15:57:50 字數 3350 閱讀 7882

//演算法總結

/***leetcode題目35:搜尋插入位置

*給定乙個排序陣列和乙個目標值,在陣列中找到目標值,並返回其索引。如果目標值不存在於陣列中,返回它將會被按順序插入的位置。

*示例 1:

*輸入: [1,3,5,6], 5

*輸出: 2

**示例 2:

*輸入: [1,3,5,6], 2

*輸出: 1

*///解法一:暴力法 | 時間複雜度:o(n) 空間複雜度:o(1)

public

intsearchinsert

(int

nums,

int target)

}// 目標值在陣列所有元素之後的情況

// 如果target是最大的,或者 nums為空,則返回nums的長度

return nums.length;

}//解法二:二分法*/ | 時間複雜度:o(logn) 空間複雜度:o(1)

public

intsearchinsert

(int

nums,

int target)

else

if(nums[middle]

< target)

else

}// 分別處理如下四種情況

// 目標值在陣列所有元素之前 [0, -1]

// 目標值等於陣列中某乙個元素 return middle;

// 目標值插入陣列中的位置 [left, right],return right + 1

// 目標值在陣列所有元素之後的情況 [left, right], return right + 1

*leetcode209.長度最小的子陣列

*給定乙個含有 n 個正整數的陣列和乙個正整數 s ,找出該陣列中滿足其和 ≥ s 的長度最小的 連續 子陣列,並返回其長度。如果不存在符合條件的子陣列,返回 0。

*示例:

*輸入:s = 7, nums = [2,3,1,2,4,3]

*輸出:2

*解釋:子陣列 [4,3] 是該條件下的長度最小的子陣列。

*///解法一:暴力解法 時間複雜度:o(n^2) | 空間複雜度:o(1)

public

intminsubarraylen

(int s,

int[

] nums)}}

// 如果result沒有被賦值的話,就返回0,說明沒有符合條件的子串行

return result == max_value ?

0: result;

}//解法二:滑動視窗:不斷的調節子串行的起始位置和終止位置,從而得出我們要想的結果 時間複雜度:o(n) | 空間複雜度:o(1)

public

intminsubarraylen

(int s,

int[

] nums)

}// 如果result沒有被賦值的話,就返回0,說明沒有符合條件的子串行

return result == max_value ?

0: result;

}

/**

*leetcode27. 移除元素

給你乙個陣列 nums 和乙個值 val,你需要 原地 移除所有數值等於 val 的元素,並返回移除後陣列的新長度。

不要使用額外的陣列空間,你必須僅使用 o(1) 額外空間並「原地」修改輸入陣列。

元素的順序可以改變。你不需要考慮陣列中超出新長度後面的元素。

示例 1:

給定 nums = [3,2,2,3], val = 3,

函式應該返回新的長度 2, 並且 nums 中的前兩個元素均為 2。

你不需要考慮陣列中超出新長度後面的元素。

*///解法一:暴力解法 | 時間複雜度:o(n^2)

public

intremoveelement

(int

nums,

int val)

i--;// 因為下表i以後的數值都向前移動了一位,所以i也向前移動一位,新的數值佔據了原來i的位置,所以需要重新判斷是否等於target,不然就會跳過該值可能導致錯誤

size--

;// 此時陣列的大小-1}}

return size;

}

//解法二:雙指標(快慢指標法):「通過乙個快指標和慢指標在乙個for迴圈下完成兩個for迴圈的工作。」 | 時間複雜度為o(n)

*leetcode59.螺旋矩陣ii

*給定乙個正整數 n,生成乙個包含 1 到 n2 所有元素,且元素按順時針順序螺旋排列的正方形矩陣。

*示例:

*輸入: 3 輸出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]

*/public

int[

]generatematrix

(int n)

// 模擬填充右列從上到下(左閉右開)

for(i = startx; i < startx + n - offset; i++

)// 模擬填充下行從右到左(左閉右開)

for(

; j > starty; j--

)// 模擬填充左列從下到上(左閉右開)

for(

; i > startx; i--

)// 第二圈開始的時候,起始位置要各自加1, 例如:第一圈起始位置是(0, 0),第二圈起始位置是(1, 1)

startx++

; starty++

;// offset 控制每一圈裡每一條邊遍歷的長度

offset +=2;

}// 如果n為奇數的話,需要單獨給矩陣最中間的位置賦值if(

(n %2)

==1)return res;

}

LeetCode刷題 演算法篇

暴力解法 class solution def twosum self,nums list int target int list int i 0 while i j i 1 while j if nums i nums j target return i,j j 1i 1 return none ...

leetcode 刷題筆記(簡單題)陣列篇

初始化陣列 int a int b new int arrays.tostring b 輸出陣列 int c new int 3 指定陣列長度 新建 arraylist 物件 arraylistarr new arraylist arr.add 1 新增元素 o 1 arr.add 3,99 向下標...

演算法刷題小總結

1.有問題 class solution if i 0 reverse nums.begin nums.end else swap nums k nums i sort nums.begin k 1 nums.end 問題 這種while 裡面加了個if else判斷的話,如果處於邊界時,else ...