第一题:977.有序数组的平方
方一:先全部平方再用sort排序
方二:双指针
因为是已经排好序的,想想冒泡排序,是一次外循环确定最大的元素放到这层的最右边,这里的话就是最大的只可能在最左边和最右边,那么就用两个指针,i,j,平方后大的那个就放到新开辟的数组result里面,然后更新一下这个指针,注意这时另一指针不变,最后这两个指针相等后再放一个值进去,再退出循环即可
class Solution {
public:
vector<int> sortedSquares(vector<int>& A) {
int k = A.size() - 1;
vector<int> result(A.size(), 0);
for (int i = 0, j = A.size() - 1; i <= j;) {
if (A[i] * A[i] < A[j] * A[j]) {
result[k--] = A[j] * A[j];
j--;
}
else {
result[k--] = A[i] * A[i];
i++;
}
}
return result;
}
};
第二题:209.长度最小的子数组
题目易错点:注意此题对子字符串的描述是nums[j],nums[j+1],nums[j+2]是这种连着的数组
是要大于等于s,没说等于
方法一:暴力解
1.知识:INT_MAX与INT_MIN
参看链接:CSDN编程社区
2.代码:这样的话时间复杂度是O(n^2)超出了时间限制,但是这个代码任然有值得学习的地方:
①判断数组是否为空
②比较大小用的INT_MAX
③int sum=0定义在第一层for循环,在第二层for循环j从i开始
④ans的取值用min函数
⑤最后return如果没有合适的子数组就说明ans还是INT_MAX,返回0,否则直接返回ans写的也很到位
class Solution {
public:
int minSubArrayLen(int s, vector<int>& nums) {
int n = nums.size();
if (n == 0) {
return 0;
}
int ans = INT_MAX;
for (int i = 0; i < n; i++) {
int sum = 0;
for (int j = i; j < n; j++) {
sum += nums[j];
if (sum >= s) {
ans = min(ans, j - i + 1);
break;
}
}
}
return ans == INT_MAX ? 0 : ans;
}
};
方法二:双指针,滑动窗口
这个还挺有意思的,其实能够满足和>=s的子数组就这么些,其实就是一些滑动窗口
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int l=nums.size();
if(l==0)
return 0;
int sum=0;
int ans=INT_MAX;
int start=0,end=0;
while(end<l){
sum+=nums[end];
while(sum>=target){
ans=min(ans,end-start+1);
sum-=nums[start];
start++;
}
end++;
}
return ans==INT_MAX? 0:ans;
}
};
第三题:59.螺旋矩阵II
这是leetcoe一位大佬的解法,在此膜拜:
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
int t = 0; // top
int b = n-1; // bottom
int l = 0; // left
int r = n-1; // right
vector<vector<int>> ans(n,vector<int>(n));
int k=1;
while(k<=n*n){
for(int i=l;i<=r;++i,++k) ans[t][i] = k;
++t;
for(int i=t;i<=b;++i,++k) ans[i][r] = k;
--r;
for(int i=r;i>=l;--i,++k) ans[b][i] = k;
--b;
for(int i=b;i>=t;--i,++k) ans[i][l] = k;
++l;
}
return ans;
}
};