力扣刷題 陣列系列 2

2021-10-18 13:22:13 字數 3957 閱讀 6610

刷題的順序,按照前輩的leetcode cookbook上的順序

給定乙個排序陣列,你需要在 原地 刪除重複出現的元素,使得每個元素只出現一次,返回移除後陣列的新長度。

不要使用額外的陣列空間,你必須在 原地 修改輸入陣列 並在使用 o(1) 額外空間的條件下完成

思考:1.題目要求原地刪除重複的元素,並且陣列是已經進行排序的,所以當我們遍歷陣列的時候,獲得的資料一定nums[i]<=nums[i+1]的

2.我們可以在遍歷的時候設定乙個指標,該指標指向第乙個元素,如果我們遍歷的元素與該元素不同,那麼我們就將指標加1,然後將當前遍歷的元素賦值給該指標指向的元素,並且將計數器加1,最終返回計數器的結果

public

intremoveduplicates

(int

nums)

else

}return count;

}

本題中的利用指標進行去重,可以避免雙重的遍歷,並且也滿足原地刪除

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

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

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

思考:本題是前一道題的削弱版,我們首先對陣列進行排序,然後我們定義乙個指標指向陣列的起點元素,然後對整個陣列進行遍歷,如果遍歷到的元素,不等於目標元素,我們將當前遍歷到的元素賦值給指標指向的位置,我們就將指標後移,最後返回指標,即是刪除元素後的陣列長度。

public

intremoveelement

(int

nums,

int val)

}//返回刪除目標元素後的陣列的長度

return j;

}

本題的解題思路類似於上一道題,但是過程要比上一道題簡單

給定乙個無重複元素的陣列 candidates 和乙個目標數 target ,找出 candidates 中所有可以使數字和為 target 的組合。

candidates 中的數字可以無限制重複被選取。

說明:所有數字(包括 target)都是正整數。

解集不能包含重複的組合。

思考: 這道題目,我當時沒有做出來,是看了前人的題解才做出來的,所以我自己表述可能不是那麼的邏輯

動態規劃題目

1.題目要求找出相加之和為目標值的所有陣列,並且同乙個元素可以重複使用,但是解集不能重複

2.我們利用動態規劃結合回溯即可

首先我們設定遞迴的起點,目標值減去當前遍歷的元素,大於零,就將該元素加入陣列,然後進入遞迴,遞迴的起點仍然是當前位置(因為題目中說了,元素可以重複使用)。當遞迴結束呼叫,我們去掉最後乙個元素,讓其回到遞迴呼叫前的狀態。

//構造乙個集合用來儲存陣列解集

list

> res =

newarraylist

<

>()

;public list

>

combinationsum

(int

candidates,

int target)

//解集中的某個解

list

list =

newarraylist

<

>()

;//遞迴求解

dfs(

0,candidates,target,list)

;return res;

}private

void

dfs(

int start,

int[

] candidates,

int target,list

list)

//如果當前的target=0,證明我們的當前解的元素之和正好等於target,將當前解加入解集空間中

if(target ==0)

else

}}

給定乙個陣列 candidates 和乙個目標數 target ,找出 candidates 中所有可以使數字和為 target 的組合。

candidates 中的每個數字在每個組合中只能使用一次。

說明:所有數字(包括目標數)都是正整數。

解集不能包含重複的組合。

思考:本題是上一道的變形,但是題目的難度公升級了,因為給定的目標陣列裡面元素是存在重複的了,並且每個數字只能使用一次

我們可以對上面的題的解法進行修改,可能導致答案錯誤的原因:

比如說我們給出了陣列是 1 1 2 3 我們給出目標值是3 因為我們題目中1出現了兩次,所以最後的解集會變成 1,2 1,2 3 但是不能出現1,1,1 因為每個數字只能用一次

所以我們可以在將解加入解集空間的時候利用集合的方法先判定要加入解空間的解是否已經存在

list

> res =

newarraylist

<

>()

;public list

>

combinationsum2

(int

candidates,

int target)

arrays.

sort

(candidates)

; list

list =

newarraylist

<

>()

;dfs(0

, target, list, candidates)

;return res;

}private

void

dfs(

int start,

int target, list

list,

int[

] candaidates)

if(target ==0)

}else

}}

給你乙個未排序的整數陣列 nums ,請你找出其中沒有出現的最小的正整數。

高階:你可以實現時間複雜度為 o(n) 並且只使用常數級別額外空間的解決方案嗎?

思考:複雜度為n的話,證明只需要遍歷一次陣列,如何判斷最小的正數?考慮到陣列的正好是n個,我們就可以把每個元素放到他對應的陣列的位置-1,比如 2 放在下標為1上,1放在下標為0上。

給定的陣列中可能會出現比陣列長度更長的元素,針對這種元素我們對他不做處理,最後的判定規則會自動把他忽略

判定沒有出現的最小正數:

遍歷陣列 nums[i] != i+1 返回 i+1

如果整個陣列都符合元素的分配位置 就返回 陣列長度+1

令 n = nums.length

會不會出現n+1存在的情況? 但是返回了n+1?

不會出現這種情況,如果存在元素n+1,那麼在陣列重新排布後,在1~n的範圍內一定會有乙個元素不存在。

public

intfirstmissingpositive

(int

nums)

}//遍歷陣列,檢視缺失的最小正數

for(

int i=

0;ireturn n+1;

}

力扣刷題系列

給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設 nums1 和 nums2 不會同時為空。從中學知識知道,如果需要求一組數字的中位數,那麼先要從小到大排列這些數字。接著,如果總共有奇數個...

leetcode力扣刷題錄2

給出乙個 32 位的有符號整數,你需要將這個整數中每位上的數字進行反轉。示例 1 輸入 123 輸出 321 示例 2 輸入 123 輸出 321 示例 3 輸入 120 輸出 21 注意 假設我們的環境只能儲存得下 32 位的有符號整數,則其數值範圍為 231,231 1 請根據這個假設,如果反轉...

刷題 力扣 119

題目鏈結 題目描述 給定乙個非負索引 k,其中 k 33,返回楊輝三角的第 k 行。在楊輝三角中,每個數是它左上方和右上方的數的和。示例 輸入 3 輸出 1,3,3,1 高階 題目分析 根據題目描述楊輝三角形每一行從左到右依次是 組合 combiner是用來計算組合的結果 依次遍歷每一行從左到右 c...