【48】(动规)最大子序和 | 最后一个单词的长度 | 加一(LC 53 | 58 | 66)

最大子序和

问题描述

给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

解题思路

要得到前n个元素的连续最大和,必定与前n-1个元素的连续最大和有关,由此可看出此题能用动态规划求解,定义dp[i]为以nums[i]结尾的连续最大和,若已知dp[i-1],则dp[i] = Math.max(dp[i-1]+nums[i],nums[i]) ,最终的结果就是值最大的dp[i]。

class Solution {
    public int maxSubArray(int[] nums) {
        int n = nums.length;
        int dp[] = new int[n];
        dp[0] = nums[0];
        int res = nums[0];
        for(int i=1;i<n;i++){
            dp[i] = Math.max(dp[i-1]+nums[i],nums[i]);
            res = Math.max(res,dp[i]);
        }
        return res;
    }
}

最后一个单词的长度

问题描述

给你一个字符串 s,由若干单词组成,单词之间用空格隔开。返回字符串中最后一个单词的长度。如果不存在最后一个单词,请返回 0 。

单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。

解题思路

这是比较简单的一题,直接从字符串的最后一位往前遍历,遇到字母则长度res+1,若是空格则返回结果res,但是还要注意一种情况:"a ",含有单词,但是字符串以空格结尾。所以再增加一个flag,当flag为0,则表示没有遇到单词,为1则表示遇到了单词,那么只有flag==1且当前字符是空格的时候才返回结果res。

class Solution {
    public int lengthOfLastWord(String s) {
        int res =0;
        int n = s.length();
        int flag = 0;//flag为0表示没有单词,为1表示有单词
        for(int i=n-1;i>=0;i--){
            if(s.charAt(i) != ' '){
                res++;
                flag = 1;
            }
            else if(flag == 1 && s.charAt(i) == ' ')
                return res;
        }
        return res;
    }
}

加一

问题描述

给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。

最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。

你可以假设除了整数 0 之外,这个整数不会以零开头。

解题思路

这个题需要解决的主要是进位问题,若是个位不进位则直接+1,若是产生进位则前一位+1,若是最高位产生了进位则需要再开辟一个空间,设置最高位为1,为模拟手动运算时的列式计算,可以在while循环中进行。

class Solution {
    public int[] plusOne(int[] digits) {
        int n = digits.length;
        int i = n-1;
        while(true){
            if(digits[i]+1 == 10){
                digits[i] = 0;
                i--;
                if(i<0){//最高位需要进位
                    digits = new int[n+1];
                    digits[0] = 1;
                    return digits;
                }
            }else{
                digits[i]++;
                break;
            }
        }
        return digits;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值