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