第三天刷题

关于今天打开了一道简单题后开始怀疑人生这件事。。。

53. 最大子数组和

 

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

 

子数组 是数组中的一个连续部分。

 

 

 

示例 1

 

输入:nums = [-2,1,-3,4,-1,2,1,-5,4]

输出:6

解释:连续子数组 [4,-1,2,1] 的和最大,为 6

 

来源:力扣(LeetCode

链接:https://leetcode-cn.com/problems/maximum-subarray

 

纠结了很多版本的代码后,发现无法考虑完全,我的思路为:后一个加到前面时变大就继续,变小就舍去,写出了如下代码,显然是不可能ac的,

class Solution {

    public int maxSubArray(int[] nums) {

        int max=nums[0];

        int[] ans=new int[nums.length];

        int flag=0;

        for(int i=1;i<nums.length;i++){

            if(max+nums[i]>=max){

                max=max+nums[i];

            }else{

                ans[flag]=max;

                flag++;

                max=nums[i];

            }

        }

        Arrays.sort(ans);

        for(int i=0;i<nums.length;i++){

            System.out.println(ans[i]);

        }

        return ans[ans.length-1];

    }

}

思考后发现这如果涉及到后一个或两个减小了但后面的第三个变大了,把三个都加上的收益大于就此断开,我完全无法解决。就此思路我想了个较为极端的,若是中间隔着十几个-1而最后为100,我该怎么知道他后面还有个大数能弥补过程中的损失呢。想了很久,没有想明白,去看题解了。

赞最多为一个简单但我没太看懂原理的代码:

class Solution {

    public int maxSubArray(int[] nums) {

        int res = nums[0];

        int sum = 0;

        for (int num : nums) {

            if (sum > 0)

                sum += num;

            else

                sum = num;

            res = Math.max(res, sum);

        }

        return res;

    }

}

[-2,1,-3,4,-1,2,1,-5,4]

i=0sum=0 num=-2-> sum=-2   res=-2

I=1:  sum=-2 num=1->sum=1   res=1

I=2: sum=1 num=-3->sum=-2    res=1

I=3: sum=0 num=4->sum=4     res=4

I=4:sum=4 num=-1->sum=3     res=4

I=5:sum=3 num=2->sum=5     res=5

I=6:sum=5 num=1->sum=6     res=6

I=7:sum=6 num=-5->sum=1    res=6

I=8:sum=1 num=4->sum=5     res=6

 

理了一遍看懂思路了,当和大于零时将后面的值加上,反之则将sum等于下一值,每一轮循环都比较全局变量ressum的大小。即sum大于零时比较res与子串和,小于等于0时比较比较res与此值大小。但判断条件,sum是否大于0,这我还是没有看懂,为什么以此为分界线呢。。。

而当我看见以动态规划作为思路的解时发现,原来这就是动态规划:

 

 

作者:LeetCode-Solution

链接:https://leetcode-cn.com/problems/maximum-subarray/solution/zui-da-zi-xu-he-by-leetcode-solution/

来源:力扣(LeetCode

 

 

代码如下:

class Solution {

    public int maxSubArray(int[] nums) {

        int pre = 0, maxAns = nums[0];

        for (int x : nums) {

            pre = Math.max(pre + x, x);

            maxAns = Math.max(maxAns, pre);

        }

        return maxAns;

    }

}

 

 

58. 最后一个单词的长度

 

给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。

 

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

 

 

 

来源:力扣(LeetCode

链接:https://leetcode-cn.com/problems/length-of-last-word

 

这题确实简单题,去掉首尾空格后找到最后一个空格,用长度-1去减空格位置即可

字符串中,trim()函数可去掉首位空格,lastIndexOf()函数可找到某个字符出现的最后位置,不过值得一提的是,其中的i是大写- -,在这儿卡了好一会。

 

代码如下:

class Solution {

    public int lengthOfLastWord(String s) {

        int k=0;

        s=s.trim();

        System.out.println(s);

        k=s.lastIndexOf(' ');

        return s.length()-k-1;

    }

}

 

翻了下答案,大家好像都在用split,记混了我以为splitpython独有来着。。那split会更方便一些。

今天还做了一些软件工程的课程作业,是设计页面,不得不说我确实没有什么审美,做的我好费劲。

posted @ 2022-03-16 23:58  水煮小白菜  阅读(21)  评论(0编辑  收藏  举报