力扣第53、58題

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,帶你刷算法。
1

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章