• 算法刷题训练(2020.9.30)


    1.最大子序和

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

    示例:

    输入: [-2,1,-3,4,-1,2,1,-5,4]
    输出: 6
    解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。

    进阶:

    如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/maximum-subarray

    代码实现:

    1.采用动态规划解法

    思路:

    ​ 动态规划的本质:改变数组元素,最后数组中数值最大的即为题解。

    ​ 倘若前一项<=0,则数组当前值不变;倘若>0,则将当前项加至sum中;最后取最大值

    class Solution {
       public int maxSubArray(int[] nums) {
             // 动态规划解法:
            int ans = nums[0]; // 最大和
            int sum = 0; // 单项和
            for (int i=0;i<nums.length;i++) {
                if(sum > 0){
                    sum += nums[i];
                }else {
                    sum = nums[i];
                }
                ans = Math.max(ans,sum);
            }
            return ans;
        }
    }
    

    2.采用贪心解法

    思路:

    ​ 贪心算法的本质:当前一项 < 0时,舍去前面所有加和,赋值为0;否则,进行加和操作,然后与最大值进行比较,最终返回最大值!

    ​ 与动态规划不同的一点是:此方法不需要改变数组内的数值,单纯提取最大值

    class Solution {
        public int maxSubArray(int[] nums) {
            // 贪心解法
            int ans = 0;
            int max = nums[0];
            for (int i = 0; i < nums.length; i++) {
                ans += nums[i];
                max = Math.max(max,ans);
                if (ans < 0){
                    ans = 0;
                }
            }
            return max;
        }
    }
    

    2.加一

    	给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。
    
    最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
    
    你可以假设除了整数 0 之外,这个整数不会以零开头。
    
    示例 1:
    
    输入: [1,2,3]
    输出: [1,2,4]
    解释: 输入数组表示数字 123。
    
    示例 2:
    
    输入: [4,3,2,1]
    输出: [4,3,2,2]
    解释: 输入数组表示数字 4321。
    

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/plus-one

    思路:

    ​ 依据题意,首位为最高位(不为0),末尾为最低位,在+1后分为如下情况:

    ​ (1)原末尾数值在 (0~8)之间,则符合条件,返回数组

    ​ (2)原末尾数值为9,则进位;更高位+1 ---》直到循环结束,仍然没有返回数组,那证明原数组最高位进一位,数组扩容,最高位为1;

    代码实现:

    class Solution {
        public static int[] plusOne(int[] digits) {
            for (int i = digits.length-1;i>=0;i--) {
                digits[i]++;
                digits[i] =digits[i]%10;
                if (digits[i] !=0){
                    return digits;
                }
            }
            digits = new int[digits.length+1];
            digits[0] = 1;
            return digits;
        }
    }
    
  • 相关阅读:
    Mybatis入门之常规操作CURD案例Demo(附源码)
    如何捕获Wince下form程序的全局异常
    如何捕获winform程序全局异常?(续)
    log4net学习目录
    如何捕获winform程序全局异常?
    有关学习的思考
    使用VS2012主题插件创建自己的主题
    Vistual Studio 2012更换皮肤
    log4net使用经验总结
    log4net使用流程
  • 原文地址:https://www.cnblogs.com/happy-prince/p/13756010.html
Copyright © 2020-2023  润新知