zoukankan      html  css  js  c++  java
  • [ Leetcode ] No.53 最大子序列和 & No.300 最长上升字序列

    No.53:最大子序列和

    首先对数组进行遍历,当前最大连续子序列和为 sum,结果为 ans。

    1. 如果 sum > 0,则说明 sum 对结果有增益效果,则 sum 保留并加上当前遍历数字
    2. 如果 sum <= 0,则说明 sum 对结果无增益效果,需要舍弃,则 sum 直接更新为当前遍历数字
      这种方法可以成为正数增益。
    for(int i = 0; i < len; i++) {
                if(sum<=0) {
                    max_num = max(nums[i], max_num);
                    sum = nums[i];
                }
                else {
                    max_num = max(sum+nums[i], max_num);
                    sum += nums[i];
                }
            }
    

    No.300:最长上升字序列
    建立一个序列长度数组ans,存放的是当前长度下,该递增序列的最大值,而这个最大值要在同等长度的序列中尽可能小。
    比方说,现在一个递增序列,[0, 6] 与 [0, 4]。那么开始时,ans[2] = 6,代表的是递增序列长度为2的时候,最大值是6。然后再看[0, 4],发现4 < 6,那么我们应该更新ans[2] = 4,因为我们是要尽可能小的最大值。
    同样的,对于序列[-1, 1, 3, 2, 4],经过计算,我们可以得到ans[3]=2,ans[4]=4。长度为3下,有递增序列[-1, 1, 3]和[-1, 1, 2],那么我们需要的是2。
    所以我们在顺序遍历数组的时候,将该位置的值依次与ans数组已经存储的值进行比较,找到一个大于自己的,并更新它。

    vector<int> ans(len+1, 0);
            ans[1] = nums[0];
            int maxlen = 1;
            for(int i = 1; i < len; i++) {
                int left = 1;
                int right = maxlen;
                while(left<=right){
                    int mid = (left + right) >> 1;
                    if(ans[mid] < nums[i])
                        left = mid + 1;
                    else right = mid - 1;
                }
                ans[left] = nums[i]; //更新该长度下的最后一个数值的大小
                if(left>maxlen)
                    maxlen = left;
            }
    
  • 相关阅读:
    Learning Spark中文版--第三章--RDD编程(1)
    关于learning Spark中文版翻译
    dom4j 常用操作
    Invalid bound statement (not found)
    touch: cannot touch ‘/var/jenkins_home/copy_reference_file.log’: Permission denied
    docker 运行tomcat 并部署 java web项目
    docker build no such file or directory
    Docker 笔记
    java 自动拆箱 自动装箱
    Ubuntu18 中文乱码 问题 解决
  • 原文地址:https://www.cnblogs.com/recoverableTi/p/12483249.html
Copyright © 2011-2022 走看看