第一題:
題目鏈接:977. 有序數組的平方 - 力扣(LeetCode)
思路:
先將數組求完平方和后進行排序,很簡單,主要是排序算法的考察。
這里采用快排
快排的思路:
取這個數組的中間值,然后以此為基準,判斷這個基準的左邊的元素是否小于基準值,右邊的元素是否大于基準值,如果兩邊都為否,也就是說左邊的值大于基準值,右邊的值小于基準值,則交換兩者的位置。然后一直迭代下去,對左邊的元素進行以上操作同時對右邊的元素也進行以上操作,最后便是排完序的結果。
代碼如下:
class Solution {
public:vector<int> sortedSquares(vector<int>& nums) {for(int i = 0; i < nums.size(); i++){nums[i] = nums[i] * nums[i];}//sort(nums.begin(), nums.end());quicksort(nums, 0, nums.size() - 1);return nums;}
private:void quicksort(vector<int> &nums, int l, int r){if(l >= r) return;int mid = l + (r - l) / 2;int pivot = nums[mid];int i = l - 1, j = r + 1;while(i < j){do i++; while(nums[i] < pivot);do j--; while(nums[j] > pivot);if(i < j) swap(nums[i], nums[j]);}quicksort(nums, l, j);quicksort(nums, j + 1, r); }
};
第二題鏈接:209. 長度最小的子數組 - 力扣(LeetCode)
思路:
雙指針:使用快慢指針,首先定義一個慢指針為0,定義快指針一直遍歷整個數組。
然后定義一個總和記錄此時相加元素的總和sum。
此時維護一個范圍讓這個區間的元素的總和一直大于target,慢指針指向這個區間的最左邊,快指針指向區間的最右邊。
如何維護,首先先快指針遍歷加到sum中,當sum的值大于等于target的時候,此時得到區間的長度進行比較最后得到最小值,同時更行左邊界,也就是讓慢指針右移直到區間內的元素總和小于target。
代碼如下:
class Solution {
public:int minSubArrayLen(int target, vector<int>& nums) {int res = INT_MAX;int sum = 0, slow = 0;for(int fast = 0; fast < nums.size(); fast++){sum += nums[fast];while(sum >= target){res = min(res, fast - slow + 1);sum -= nums[slow];slow++;}}return res == INT_MAX ? 0 : res;}
};
第三題鏈接:59. 螺旋矩陣 II - 力扣(LeetCode)
思路:
模擬把元素放進指定位置的過程。定義上下左右四個邊界。當第一行的元素放入后,上邊界++,當最后一列的元素放入后,右邊界--,當最后一行的元素放入后,下邊界--,當第一列元素放入后,左邊界++;直到放完為止。
代碼如下:
class Solution {
public:vector<vector<int>> generateMatrix(int n) {vector<vector<int>> res(n, vector<int>(n, 0));int num = 1; int des = n * n;int l = 0, r = n - 1, t = 0, b = n - 1;while(num <= des){for(int i = l; i <= r; i++){res[t][i] = num++;}t++;for(int i = t; i <= b; i++){res[i][r] = num++;}r--;for(int i = r; i >= l; i--){res[b][i] = num++;}b--;for(int i = b; i >= t; i--){res[i][l] = num++;}l++;}return res;}
};