考完蓝桥杯,打算再好好学习一下算法。开始接着刷代码随想录啦,数组冲冲冲。
二分查找
在左闭右闭的区间
class Solution {
public:
int search(vector<int>& nums, int target) {
int l=0,r=nums.size()-1;
while(l<=r)
{
int mid=(l+r+1)/2;
int num=nums[mid];
if(num>target)
r=mid-1;
else if(nums[mid]==target)
return mid;
else
l=mid+1;
}
return -1;
}
};
移除元素
利用双指针原地移除目标元素
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int n=nums.size();
int i=0;
for(int j=0;i<n,j<n;j++)
{
if(nums[j]!=val)
{
nums[i++]=nums[j];
}
}
return i;
}
};
有序数组的平方
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int n = nums.size();
vector<int> num(nums.size(), 0);//得用vector 数组会报错
int k = nums.size() - 1;
for (int i = 0, j = n - 1;i<=j;) {
if (nums[i] * nums[i] > nums[j] * nums[j])
{
num[k--] = nums[i] * nums[i];
i++;
}
else
{
num[k--] = nums[j] * nums[j];
j--;
}
}
return num;
}
};
长度最小的子数组
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int n=nums.size();
int i=0;
int res=10000;
int sum=0;
for(int j=0;j<n;j++)
{
sum+=nums[j];
while(sum>=target)
{
int strength=j-i+1;
if(strength<res)
res=strength;
sum-=nums[i];
i++;
}
}
if(res==10000)
res=0;
return res;
}
};
螺旋矩阵II
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>>res(n,vector<int>(n,0)) ;
int i=0,j=0;
int loop=(n+1)/2;//要走多少圈
int startx,starty;//开始坐标
int mid=n/2;
int offset=1;
int k=1;
while(loop--)
{
int i=startx,j=starty;
for(j;j<n-offset;j++)//从左到右
{
res[i][j]=k++;
}
for(i;i<n-offset;i++)//从上到下
{
res[i][j]=k++;
}
for(;j>startx;j--)
{
res[i][j]=k++;
}
for(;i>starty;i--)
{
res[i][j]=k++;
}
startx++;
starty++;
offset++;
}
if (n % 2) //当n为奇数的时候,最中间的值需要单独赋值
{
res[mid][mid] = k;
}
return res;
}
};