刷题
[toc]
数组
35.搜索插入位置(二分)
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int n=nums.size();
int l=0,r=n-1;//[l,r]
while(l<=r){//[l,r]区间非空
int mid=l+(r-l)/2;
if(nums[mid]==target)
return mid;
else if(nums[mid]>target){//target在mid左边
r=mid-1;
}else{
l=mid+1;
}
}
//target 四种情况,区间前[0,-1],区间中[l,r],区间尾r+1
return r+1;
}
};
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int n=nums.size();
int l=0,r=n;
while(l<r){//[l,r)
int mid=l+(r-l)/2;
if(nums[mid]==target)
return mid;
else if(nums[mid]>target){
r=mid;
}else{
l=mid+1;
}
}
//考虑四种情况,区间之前[0,1),区间中[l,r),区间后[l,r)
return r;
}
};
27.移除数组(双指针)
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int i=0;
int n=nums.size();
for(int j=0;j<n;j++){
if(nums[j]!=val){
nums[i++]=nums[j];
}
}
return i;
}
};
209.长度最小的子数组(滑动窗口)
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int n=nums.size();
int sum=0;
int l=0;
int ans=INT_MAX;
for(int i=0;i<n;i++){
sum+=nums[i];
while(sum>=target){//每次更新i起始位置,不断比较
ans=min(ans,i-l+1);
sum-=nums[l++];
}
}
return ans==INT_MAX?0:ans;
}
};
59.螺旋矩阵(模拟)
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> res(n,vector<int>(n,0));
int startx=0,starty=0;//每次循环开始坐标
int loop=n/2;//循环圈数
int offset=1;//每行循环次数变化量
int count=1;//计数
int i,j;
while(loop--){
for(j=starty;j<starty+n-offset;j++){
res[startx][j]=count++;
}
for(i=startx;i<startx+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+=2;
}
//奇数 中心位置
if(n%2){
res[n/2][n/2]=count;
}
return res;
}
};
链表
203.移除链表元素
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
ListNode* l=new ListNode(0);//虚拟头指针
l->next=head;
ListNode* cur=l;//设当前指针,不改变原指针
while(cur->next!=nullptr){
if(cur->next->val==val){
cur->next=cur->next->next;
}
else{
cur=cur->next;
}
}
return l->next;
}
};
707.设计链表
206.反转链表
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode *tmp;
ListNode *cur=head;
ListNode *pre=NULL;
while(cur){
tmp=cur->next;
cur->next=pre;
pre=cur;
cur=tmp;
}
return pre;
}
};