今天是第二天,第一道题很简单, 977. 有序数组的平方
先复习了一下冒泡排序,结果超时了
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
for(int i=0;i<nums.size();i++)
nums[i]=nums[i]*nums[i];
for(int i=0;i<nums.size()-1;i++){
for(int j=0;j<nums.size()-1-i;j++){
if(nums[j]>nums[j+1]){
int temp=nums[j];
nums[j]=nums[j+1];
nums[j+1]=temp;
}
}
}
return nums;
}
};
使用双指针另造数组排序
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int low=0;
int high=nums.size()-1;
int key=high;
vector<int>A(high+1,0);
while(key>=0){
if(nums[low]*nums[low]<nums[high]*nums[high]){
A[key]=nums[high]*nums[high];
high--;
}
else{
A[key]=nums[low]*nums[low];
low++;
}
key--;
}
return A;
}
};
209. 长度最小的子数组
这题较难,一开始看着滑动窗口几个字写了如下代码,但是实际上效果与暴力解是一模一样的
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int Index=0;
int highIndex=0;
int the=nums.size();
int sum=0;
int key=0;
while(highIndex<nums.size()){
for(int i=Index;i<=highIndex;i++){
sum+=nums[i];
}
if(sum==target){
key=1;
if(highIndex-Index+1<the)
the=highIndex-Index+1;
highIndex++;
Index++;
}
else if(sum<target){
highIndex++;
}
else{
key=1;
if(highIndex-Index+1<the)
the=highIndex-Index+1;
if(highIndex==Index){
highIndex++;
Index++;
}
else{
Index++;
}
}
sum=0;
}
if(key==1)
return the;
else
return 0;
}
};
与真正滑动串口的区别是,真实的滑动窗口不需要每次都重新算窗口内的值,只是在sum中进行移除与增加
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int the=nums.size()+1;
int sum=0;
int j=0;
for(int Index=0;Index<nums.size();Index++){
sum+=nums[Index];
while(sum>=target){
if(the>Index-j+1){
the=Index-j+1;
}
sum-=nums[j++];
}
}
return the!=nums.size()+1?the:0;
}
};
59. 螺旋矩阵 II
主要是数学思路,要n/2圈,最后一个空单独弄,四条边各一个for,注意区间。还有每一圈的开始和结束需要一个标识符。
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>>the(n,vector<int>(n,0));
int x=0;
int round=n/2;
int mid=n/2;
int num=1;
int j=0,i=0;
while(round--){
for(j=x;j<n-1-x;j++){
the[x][j]=num++;
}
for(i=x;i<n-1-x;i++){
the[i][j]=num++;
}
for(;j>x;j--){
the[i][j]=num++;
}
for(;i>x;i--){
the[i][j]=num++;
}
x++;
}
if(n%2!=0)
the[mid][mid]=n*n;
return the;
}
};