977 有序数组的平方 | 209 长度最小的子数组

772 阅读1分钟

有序数组的平方

题目描述:给定一个非递减顺序排序的整数数组 nums,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。

思路

依旧是双指针

由于数组最开始是按照非递减顺序排列的,因此数字平方越大的越接近两边。

具体来说,如果序列中只有正数或只有负数,那么比较好说;

而如果序列中既有正数,也有负数的话,那么序列中间的数更加接近0,其平方比较小,序列两边的数离0比较远,其平方反而比较大。

因此,有双指针依次从两边往中间缩小,找到平方从大到小的数字。

代码

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

长度最小的子数组

题目描述:给定一个含有 n 个正整数的数组和一个正整数 target。找出该数组中满足其和 >= target 的长度最小的连续子数组,并返回其长度。如果不存在符合条件的子数组,返回0。

思路

本题 滑动窗口

参考:labuladong.gitee.io/algo/di-lin…

模版:

 int left = 0, right = 0;
 ​
 while (right < nums.size())  
 {
     window.add(nums[right]);
     right++;  // 增大窗口 
     ···
     
     // 在可以进行debug
   
     while (window needs shrink)  // 判断左侧窗口是否要收缩
     {
         window.remove(nums[left]);
         left++;  // 缩小窗口
         ···
     }
 }

数组中的每个元素都只会进入窗口一次,然后被移出窗口一次,因此时间复杂度与数组的长度成正比,即O(n)。

代码

 class Solution {
 public:
     int minSubArrayLen(int target, vector<int>& nums) {
         int left = 0, right = 0;  // [left, right)
         int minLen = nums.size() + 1;
         int sum = 0;  
         while (right < nums.size())
         {
             sum += nums[right++];  // add
 ​
             // cout << sum << endl;  // for debug
             
             while (sum >= target) // delete 
             {
                 if (right - left < minLen)
                     minLen = right - left;
                 sum -= nums[left++];
             }
         }
         if (minLen != nums.size() + 1)
             return minLen;
         else
             return 0;
     }
 };