力扣704二分查找法
class Solution {
public:
// //1.左闭右闭写法
// int search(vector<int>& nums, int target) {
// int left = 0,right = nums.size()-1;
// while(left<=right){
// int mid = (left+right)/2;
// if(nums[mid]>target){
// right = mid-1;//nums[mid]一定不是要搜索的值
// }
// else if(nums[mid]<target){
// left = mid+1;
// }
// else return mid;
// }
// return -1;
// }
//2.左闭右开写法
int search(vector<int>& nums, int target) {
int left = 0,right = nums.size();
while(left<right){//这儿不能等于
int mid = (left+right)/2;
if(nums[mid]>target){
right = mid;
}
else if(nums[mid]<target){
left = mid +1;
}
else return mid;
}
return -1;
}
};
力扣27移除元素
class Solution {
public:
//双指针
int removeElement(vector<int>& nums, int val) {
int i=0,j=0;
for(;j<nums.size();j++){
if(nums[j]!=val){
nums[i++]=nums[j];
}
}
return i;
}
};
力扣977有序数组的平方
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
vector<int> res(nums.size());
int k = res.size()-1;
int i = 0,j= nums.size()-1;
while(i<=j){//相等的时候也要继续,否则最后ij指向的元素就没被处理
if(abs(nums[i])>abs(nums[j])){
res[k--]=nums[i]*nums[i];
i++;
}
else {
res[k--]=nums[j]*nums[j];
j--;
}
}
return res;
}
};
力扣209长度最小的子数组
class Solution {
public:
//用一个for循环解决 变量j指的是终止位置
int minSubArrayLen(int target, vector<int>& nums) {
int minlenth=INT_MAX;//初始为最大值
int sum=0;//窗口和
int i=0;
//j是滑动窗口的右端 i是左端
for(int j=0;j<nums.size();j++){
sum+=nums[j];
//必须用while,不能用if,if只能保证一次 举个例子 nums = 1 1 1 1 100, target=50
while(sum>=target){
minlenth = min(minlenth,j-i+1);
sum-=nums[i++];
}
}
if(minlenth==INT_MAX) return 0;//如果不存在符合条件的子数组,返回 0
return minlenth;
}
};
力扣59螺旋矩阵
思考:怎么转?
思考:转多少圈?
结论: N/2圈
class Solution {
public:
//规则:左闭右开
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> result(n,vector<int>(n,0));//初始化一个二维矩阵
int start_x=0,start_y=0;//初始化每一轮遍历的开始坐标,我们认为第一轮是左上角
int i=0,j=0;
int time=1;//time表示这是第几轮
int count=1;//计数
while(time<=n/2){//转n/2圈
//从左往右
for(j=start_y;j<n-time;j++){
result[start_x][j]=count++;
}
//从上往下
for(i=start_x;i<n-time;i++){
result[i][j]=count++;//注意不是result[i][start_y]
}
//从右往左
for(j;j>start_y;j--){
result[i][j]=count++;
}
//从下往上
for(i;i>start_x;i--){
result[i][j]=count++;
}
//每转一圈,需要更新
time++;//下一轮
//下一轮起点是原来的右下角
start_x++;
start_y++;
}
//看看是否是奇数
if(n%2==1){
result[start_x][start_y]=count;
}
return result;
}
};