[ 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;
        }

猜你喜欢

转载自www.cnblogs.com/recoverableTi/p/12483249.html