代码随想录 长度最小的子数组、有序数组的平方

有序数组的平方

这是一个什么样的问题?

一串有正有负的有序数组,要求在o(n)的时间复杂度下完成将其中的每个项平方之后再排序

问题解决的思路是什么?

逻辑思路

双指针法,最左边一个指针,最右边一个指针,比较大小,谁大放在新的数组最后,放了之后对应的指针发生移动,就这样直到移动到两个指针重合,不过这种情况下也需要吧两个指针同时指向的那个数放进数组中。

代码思路

一个while循环一直转,当两个指针重合的时候跳出,或者说左指针的位置在右指针右边的时候退出循环,循环中判断左右指针的值那个比较大,大的那个值放在数组的最后。当然宝贝千万别忘了判断特殊情况,当数组只有一个数或者是个空数组的情况单独讨论一下。

代码

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        int left = 0;
        int right = nums.size() - 1;
        int j = right;
        vector<int> result(nums.size(), 0);
        while(left <= right) {
            if(nums[left] * nums[left] > nums[right] * nums[right]) {
                result[j--] = nums[left] * nums[left];
                left++;
            }
            else {
                result[j--] = nums[right] * nums[right];
                right--;
            }
        }
        return result;

    }
};

语法

如何给vector赋初值,一个圆括号,里面两个参数,第一个参数写元素个数,第二个参数写元素的初值。

长度最小的子数组

这是一个什么样的问题?

给定一个含有n个正整数的数组和一个正整数target,找出其中数组中每个元素之和大于等于target的子数组,返回其长度,如果没有就返回0.

问题解决的思路是什么?

逻辑思路

双指针法,一个快指针一个慢指针,两个指针之间所有的数的和小于target了快指针就向前,大了慢指针向前一个,sum永远是两个指针之间的和,但不是用循环加的,是sum动态变化。if判断之后执行的sum+=和sum-=

代码思路

一个循环循环的是快指针,到数组长度为止,result返回的为slow与fast之间数距离 + 1,每次取个最小值就行,fast指向的数在fast每次更新的时候固定加到sum上,for循环中有个while循环让数组和知道小于target之后退出循环

代码

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int fast = 0;
        int slow = 0;
        int sum = 0;
        int result = nums.size() + 1;
        for (fast; fast < nums.size(); fast++) {
            sum += nums[fast];
            while(sum >= target) {
                sum -= nums[slow];
                result = min(result, fast - slow + 1);
                slow++;
            }            
        }
        if (result == nums.size() + 1) return 0;
        return result;
    }
};
逻辑小思路

取最小值的过程中,为了让初始值不影响判断,定一个远超可能交过范围的一个数。

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值