leetcode(持续更新

124 阅读1分钟

刷题

[toc]

数组

35.搜索插入位置(二分)

image-20210325153431494

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.移除数组(双指针)

image-20210325155124352

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.长度最小的子数组(滑动窗口)

image-20210325155306092

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.螺旋矩阵(模拟)

image-20210325160057631

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.移除链表元素

image-20210325164138128

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.设计链表

image-20210325165803499

206.反转链表

image-20210327105714678

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;
    }
   
};

142.环形链表||

image-20210327105926998