Day2
1.掌握滑動窗口法
2.模擬題,堅持循環不變量原則
209 長度最小的子數組
暴力法:
class Solution { public:int minSubArrayLen(int target, vector<int>& nums) {//暴力法int i, j; //i代表起始點,j代表終止點int sum; //子序列之和int length = 0; //子序列的長度int result = INT32_MAX; //最終結果for(i = 0; i < nums.size(); i++){sum = 0;for(j = i; j < nums.size(); j++){sum += nums[j];if (sum >= target){length = j - i + 1;if(length < result) result = length;break;}}}return result == INT32_MAX ? 0 : result;} };
注意暴力法里面,如果找到符合條件的子序列了,直接break跳出j的循環
雙指針法(滑動窗口法):
class Solution { public:int minSubArrayLen(int target, vector<int>& nums) {//雙指針法int i = 0, j = 0; //i代表起始點,j代表終止點int sum = 0; //子序列之和int length = 0; //子序列的長度int result = INT32_MAX; //最終結果for(j = 0; j < nums.size(); j++){sum += nums[j];while(sum >= target){length = j - i + 1;if(length < result) result = length;sum -= nums[i];i ++;} }return result == INT32_MAX ? 0 : result;} };
為什么時間復雜度是O(n)?
看每一個元素被訪問的次數(這也是一個好的計算時間復雜度的方法),每個元素在滑動窗后進來操作一次,出去操作一次,每個元素都是被操作兩次,所以時間復雜度是 2 × n 也就是O(n)。
59.螺旋矩陣II
模擬題,難點在于邊界值的判斷,核心是堅持循環不變量原則,這里我們堅持左閉右開
class Solution { public:vector<vector<int>> generateMatrix(int n) {vector<vector<int>> res(n, vector<int>(n,0));int startx = 0, starty = 0; //橫著或豎著循環的起始位置int loop = n / 2; //循環的圈數,若n為奇數,需特殊判斷int mid = n / 2;int count = 1; //矩陣賦值int offset = 1; //每條要循環的邊的長度int i, j;while(loop--){i = startx;j = starty; ?//按邊依次循環,用到了4個forfor( ; j < n - offset; j ++){res[i][j] = count++;}for( ; i < n - offset; i++){res[i][j] = count++;}for( ; j > starty; j--){res[i][j] = count++;}for( ; i > startx; i--){res[i][j] = count++;}startx ++;starty ++;offset ++;}//若n為奇數,需要單獨給中間值賦值if(n % 2){res[mid][mid] = count;}return res;} };