977.有序数组的平方
法一:先平方后排序
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int i,j,min,temp;
for(i=0;i<nums.size();i++){
nums[i]=nums[i]*nums[i];
}
for(i=0;i<nums.size();i++){
min=i;
for(j=i+1;j<nums.size();j++){
if(nums[j]<nums[min])
min=j;
}
temp=nums[i];
nums[i]=nums[min];
nums[min]=temp;
}
return nums;
}
};
法二:双指针
使用两个指针分别指向位置 0和 n−1,每次比较两个指针对应的数,选择较大的那个逆序放入答案并移动指针
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
vector<int> res(nums.size(), 0);//注意初始化
int i=0,j=nums.size()-1;
int k=j;
for(;i<=j;){
if(nums[i]*nums[i]>nums[j]*nums[j]){
res[k--]=nums[i]*nums[i];
i++;
}else{
res[k--]=nums[j]*nums[j];
j--;
}
}
return res;
}
};
209.长度最小的子数组
法一:暴力双循环
时间复杂度O(n^2) 会超时
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int result = INT32_MAX; // 最终的结果
int sum = 0; // 子序列的数值之和
int subLength = 0; // 子序列的长度
for (int i = 0; i < nums.size(); i++) { // 设置子序列起点为i
sum = 0;
for (int j = i; j < nums.size(); j++) { // 设置子序列终止位置为j
sum += nums[j];
if (sum >= target) { // 一旦发现子序列和超过了s,更新result
subLength = j - i + 1; // 取子序列的长度
result = result < subLength ? result : subLength;
break; // 因为我们是找符合条件最短的子序列,所以一旦符合条件就break
}
}
}
// 如果result没有被赋值的话,就返回0,说明没有符合条件的子序列
return result == INT32_MAX ? 0 : result;
}
};
法二:双指针(滑动窗口)
时间复杂度O(n)
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int i = 0,j,sum = 0,length,minlength = INT32_MAX;
for(j = 0;j < nums.size();j++){
sum += nums[j];
while(sum >= target){
length = j-i+1;
minlength = length > minlength ? minlength : length;
sum -= nums[i++];
}
}
return minlength == INT32_MAX ? 0 : minlength;
}
};
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> res(n,vector<int>(n,0));
int i,j,count = 1,startx = 0,starty = 0,offset = 1,num = n / 2;
while(num--){
for(j = starty;j < n-offset;j++)
res[startx][j]=count++;
for(i = startx;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++;
}
if(n % 2){
res[n/2][n/2]=count;
}
return res;
}
};
版本二
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> vec(n,vector<int>(n,0));
int i,j,k = 1;
int row=0,col=0;
for(i = 0; i < n/2; ++i){
row=i;
col=i;
for(j = col; j < n-1-i; j++)
vec[row][col++] = k++;
for(j = row; j < n-1-i; j++)
vec[row++][col] = k++;
for(j = col; j > i; j--)
vec[row][col--] = k++;
for(j = row; j > i; j--)
vec[row--][col] = k++;
}
if(n % 2){
vec[n/2][n/2]=k;
}
return vec;
}
};