977
思路
使用兩個指針分別指向位置 0 和 n?1,每次比較兩個指針對應的數,選擇較大的那個逆序放入答案并移動指針。這種方法無需處理某一指針移動至邊界的情況。
時間復雜度:O(n)
空間復雜度:O(1)
代碼
class Solution {
public:vector<int> sortedSquares(vector<int>& nums) {int left = 0;int right = nums.size()-1;int last = right;vector<int> ans(nums.size());while(left<=right){if(nums[left]*nums[left]>nums[right]*nums[right]){ans[last--]=nums[left]*nums[left++];}else{ans[last--]=nums[right]*nums[right--];}}return ans;}
};
209
思路
所謂滑動窗口,就是不斷的調節子序列的起始位置和終止位置,從而得出我們要想的結果。
窗口的起始位置如何移動:如果當前窗口的值大于等于s了,窗口就要向前移動了(也就是該縮小了)。
窗口的結束位置如何移動:窗口的結束位置就是遍歷數組的指針,也就是for循環里的索引。
滑動窗口的精妙之處在于根據當前子序列和大小的情況,不斷調節子序列的起始位置。從而將O(n^2)暴力解法降為O(n)。
時間復雜度:O(n)
空間復雜度:O(1)
代碼
class Solution {
public:int minSubArrayLen(int target, vector<int>& nums) {int sum = 0, sublen = 0, i=0;int result = INT32_MAX;for (int j=0; j<nums.size(); j++){sum+=nums[j];while(sum>=target){sublen = j-i+1;result = sublen<result?sublen:result;sum -= nums[i++];}}return result == INT32_MAX?0:result;}
};