53、最大子序和
給定一個整數數組 nums ,找到一個具有最大和的連續子數組(子數組最少包含一個元素),返回其最大和。
示例:
輸入: [-2,1,-3,4,-1,2,1,-5,4],
輸出: 6
解釋: 連續子數組 [4,-1,2,1] 的和最大,爲 6。
解題思路
1. 如果 sum > 0,則說明 sum 對結果是增加效果,則 sum 保留並加上當前遍歷數字
2. 如果 sum <= 0,則說明 sum 對結果沒有增加效果效果,需要捨棄,則 sum 直接更新爲當前遍歷數字
3. 每次比較 sum 和 ans的大小,將最大值置爲ans,遍歷結束返回結果
4. 時間複雜度:O(n)O(n)
代碼:
class Solution {
public int maxSubArray(int[] nums) {
int ans=nums[0];
int sum=0;
for(int num:nums){
if(sum>0){
sum+=num;
}else{
sum=num;
}
ans=Math.max(ans,sum);
}
return ans;
}
}
58、最後一個單詞的長度
給定一個僅包含大小寫字母和空格 ’ ’ 的字符串 s,返回其最後一個單詞的長度。如果字符串從左向右滾動顯示,那麼最後一個單詞就是最後出現的單詞。
如果不存在最後一個單詞,請返回 0 。
說明:一個單詞是指僅由字母組成、不包含任何空格字符的 最大子字符串。
示例:
輸入: “Hello World”
輸出: 5
解題思路:
關於這個問題,一開始想到了使用棧的方法,從後面往前進行輸出,第一個是空格就出棧,再次遇到空格就停止,統計除了空格的出棧的次數,就是最後的結果,後來一想,使用兩個指針一樣可以,同樣的方法,一個end,一個start,之間的就是需要的結果。
代碼:
class Solution {
public int lengthOfLastWord(String s) {
int end = s.length() - 1;
while(end >= 0 && s.charAt(end) == ' ') end--;
if(end < 0) return 0;
int start = end;
while(start >= 0 && s.charAt(start) != ' ') start--;
return end - start;
}
}
關注公衆號,奈斯雜文,菜鳥小謝帶你學你java,帶你刷算法。