該題目主要的思考就是在遍歷陣列時候是否考慮加上前面陣列。
例如樣例 [-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...