LeetCode刷題記錄

2021-10-01 22:49:28 字數 2619 閱讀 4099

動態規劃和貪心演算法的異同點:

class

solution;}

}}throw

newruntimeexception()

;}}時間複雜度:o

(n^2

)對於每個元素,我們試圖通過遍歷陣列的其餘部分來尋找它所對應的目標元素,這將耗費 o

(n)o

(n) 的時間。

因此時間複雜度為 o

(n^2

)

需要一種方法,尋找符合要求的元素(target-nums[i])並返回其索引

元素與索引對應最好的方法:雜湊表

通過「以空間換時間」的方式,可以將查詢時間從o(n)轉換為o(1)

class

solution

for(

int i =

0; i < nums.length; i++);

}}throw

newillegalargumentexception

("no two sum solution");

}}

時間複雜度:o(n)o(n),

我們把包含有 n個元素的列表遍歷兩次。由於雜湊表將查詢時間縮短到 o(1),所以時間複雜度為 o(n)。

事實證明:我們用一次遍歷就可以完成:在將元素插入表的同時,同時在表中 查詢當前元素所對應的目標元素

# 插入表的同時,目標元素一定在當前表麼

2357

target 10

##因為此假設:假設每種輸入只會對應乙個答案,所以陣列元素只會存在唯一符合條件的兩個元素

class

solution;}

map.

put(nums[i]

, i);}

throw

newillegalargumentexception

("no two sum solution");

}}

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

經驗:動態改變陣列的下標不可行 移動後指標回退—錯誤

public

intremoveduplicates

(int

nums)

}return j+1;

}

計算所有連續子陣列的和,求最大值

分治法的精髓在於:

分-----將問題分解為規模更小的子問題;

治-----將這些規模更小的子問題逐個擊破;

合-----將已解決的子問題合併,最終得出「母」問題的解;

取陣列中心點為中心,最大子序要麼全在中心左邊,要麼在右邊,要麼跨中心

跨中心的情況:分治成中心點左側和右側最大子序和的問題,再分別用貪心演算法

從哪邊算意味著(中心算):從哪邊連續計數

每一步都選最優解,最後就是全域性最優方案

遍歷陣列並更新1. 當期元素 2. 當前元素位置的最大和(currentsum=nums[0]) 3.總的最大和(maxsum=nums[0])

特點:區域性最優解推到全域性最優解。

從第二個元素開始遍歷,

修改陣列跟蹤當前位置的最大和

遍歷陣列,更新當前位置的最大和nums[i],全域性的最大和maxsum=nums[0]

特點:區域性最優解推到全域性最優解。

保留之前所有最優解—(以i結尾的最大子序和)

步驟:從第二個元素遍歷,若前乙個(子序和)為正數,才會累加當前數字——>當前最大和

根據當前最大和求出全域性最大和

[-2,1,-3,4,-1,2,1,-5,4]

dp[i]表示以i結尾的最大子序和 dp[i]=max

nums[0]>0 nums[1]=nums[1]+nums[0]

nums[1]>0 nums[2]=nums[2]+nums[1]

nums[2]>0 nums[3]=nums[3]+nums[2]

都是通過遞推的方式,通過區域性最優解來推導全域性最優解

貪心演算法是動態規劃的一種特殊形式

特點是每一步都是區域性最優解,只保留上一步的最優解

動態規劃演算法:

特點是每一步

2.狀態轉移方程:區域性最優解===>全域性最優解

3.邊界條件:可直接得出的區域性最優解。

## 每次拿能拿的最大的,就是貪心。 

貪心演算法最經典的例子,給錢問題。

比如中國的貨幣,只看元,有1元2元5元10元20、50、100

如果我要16元,可以拿16個1元,8個2元,但是怎麼最少呢?

如果用貪心算,就是我每一次拿那張可能拿的最大的。

比如16,我第一次拿20拿不起,拿10元,ok,剩下6元,再拿個5元,剩下1元

也就是3張 10、5、1。

leetcode刷題記錄

我覺得每天來兩道,練習練習,再看看人家是怎麼優化的。1.給定乙個整數陣列 nums 和乙個目標值 target,請你在該陣列中找出和為目標值的那 兩個 整數,並返回他們的陣列下標。c 暴力求解,204ms,9.1m class solution for index,num in enumerate ...

leetcode刷題記錄

工作之餘刷刷題排解下寂寞 1 面試題66.構建乘積陣列 解題思路 題目要求可以簡化為求陣列中任意乙個元素左右兩邊所有元素的乘積。偷懶就用了乙個套路,練習了p c c python class solution def constructarr self,a list int list int 除法是...

leetcode刷題記錄

對應劍指offer刷題記錄,leetcode也來個。1.27.移除元素 這道題主要考點是雙指標,我自己的思路是,定義兩個指標,將需要移除的元素移到陣列的最後,同時移動low指標,代表陣列此時的大小,如下 class solution return i 其實還有一種指標,就是快慢指標,並不是像上面這樣...