Leetcode 51 60刷題筆記(非困難題目)

2021-10-10 23:26:27 字數 3408 閱讀 4614

該題目主要的思考就是在遍歷陣列時候是否考慮加上前面陣列。

例如樣例 [-2,1,-3,4,-1,2,1,-5,4]

我們從 下標 1 開始遍歷,此時prev陣列 = -2,那麼此時我們如果將 -2 加入子陣列中那麼會導致綜合減少(因為prev陣列和 < 0),所以此時應當將 1 作為新子陣列的頭部,繼續向後遍歷(此時需要記錄最大子陣列和的值)

//最大子陣列和

public

intmaxsubarray

(int

nums)

int prev = nums[0]

;int ans = nums[0]

;for

(int i=

1; i)else

ans = math.

max(ans,prev);}

return ans;

}

該題目使用的是模擬法,我們通過模擬走路的形式,就是需要標記乙個方向即可,並且在到達臨界時候更改方向。

//模擬法

public list

spiralorder

(int

matrix)

int rows = matrix.length, columns = matrix[0]

.length;

boolean

visited =

newboolean

[rows]

[columns]

;int total = rows * columns;

int row =

0, column =0;

int[

] directions =,,

,};int directionindex =0;

for(

int i =

0; i < total; i++

)//計算真實下一步的位置

row += directions[directionindex][0

];column += directions[directionindex][1

];}return order;

}

該題目我是通過記錄乙個最遠到達的位置,通過搜尋能夠到達的最遠位置內的點,然後不斷更新最遠距離,一旦能夠到達的最遠距離超過最後一位,則說明成功。

//跳躍遊戲

public

boolean

canjump

(int

nums)

//如果能夠到達的最遠距離超過最後一位,說明成功

if(rightmost >= nums.length -1)

}return

false

;}

該題目需要注意的就是先排序後再分情況討論。

這裡為什麼需要排序呢?

如果不排序的話,那麼我們就無法確認這個混亂的區間集合如何進行合併,所以這裡的我採用的是對做區間進行公升序排序,這樣可以保證當需要分割出新的區間時,我們可以判斷出來(即下一位區間的左邊界 > 當前區間的右邊界)

排序後一共有三種情況,我在**的註解中有寫到。

在這裡插入**片    public

int[

]merge

(int

intervals));

/* 1.下乙個陣列的左邊界 > 當前陣列的右邊界。此時需要將當前陣列插入list,並更換當前陣列

2.下一位陣列的左邊界 <= 當前陣列的右邊界。

2.1 下一位陣列的右邊界 > 當前陣列的右邊界。更新當前陣列右邊界

2.2 下一位陣列的右邊界 <= 當前陣列右邊界。(包含關係)不做處理

*/list<

int[

]> list =

newarraylist

<

>()

;int left =-1

;int right = left;

for(

int[

] interval : intervals)

//情況 1

if(interval[0]

> right));

left = interval[0]

; right = interval[1]

;}else

else}}

//最後還會剩下乙個組合,需要記得新增進去

list.

add(

newint

);int[

] ans =

newint

[list.

size()

][2]

;for

(int i=

0; i)return ans;

}

該題比較簡單,你可以正序遍歷也可以反序遍歷。

不管怎麼樣都是o(n)時間複雜度。

反序遍歷就是當找到第乙個非空字元開始記錄,直到碰到空格為止,

下面**我是用正序遍歷,思路類似(不過正序稍微考慮的多點)

public

intlengthoflastword

(string s)

//記錄單詞起始和結尾

int len =0;

//用於標記是否經過乙個完整的單詞

boolean flag =

false

;for

(int i=

0; ilength()

; i++

)else

else}}

return len;

}

該題和54一樣的,也是使用模擬法,模擬走路的方式就行了。

上個題目我是直接使用後面題解,下面我就自己寫個帶註解的版本。

public

int[

]generatematrix

(int n)

,//向右

,//向下

,//向左

//向上};

//用於判斷是否被訪問過/新增過

boolean

isvisit =

newboolean

[n][n]

;int

ans =

newint

[n][n]

;//標記方向

int index =0;

int row =0;

int col =0;

int num =1;

for(

int i=

0; i) row += direction[0]

; col += direction[1]

;}return ans;

}

開始刷題LeetCode

今天決定開始刷題,每天至少一題,如果題目確實沒有解決出來沒有關係,但是要保證每天至少接觸了一道新的題目!一定要堅持下去,現在是個菜鳥可能會感覺有點難度,堅持下去,總有一天會好的!今天是第一天,做的第乙個題目 reverse words in a string given an input strin...

leetcode刷題歷程

難度 簡單 題目 給定乙個整數陣列 nums 和乙個目標值 target,請你在該陣列中找出和為目標值的那 兩個 整數,並返回他們的陣列下標。你可以假設每種輸入只會對應乙個答案。但是,你不能重複利用這個陣列中同樣的元素。示例 給定 nums 2,7,11,15 target 9 因為 nums 0 ...

LeetCode刷題總結

123 4567 891011 12 元素交換 swap a 1 a 3 sort排序 sort a.begin a.end 陣列顛倒 reverse a.begin a.end 陣列元素置為0 memset a,0,a.size 陣列取值 a.push back 定義二維陣列 vector vec...