10.22算法

1.4.长度最小的子数组

滑动窗口。定义i,j作为左右窗口。若第一次满足sum值大于等于我们的目标值,则用sublength返回当前窗口的长度。然后左窗口收缩,再次判断是否大于等于目标值。满足就再次收缩。(sum-=nums[i++])

class Solution {

public:

  int minSubArrayLen(int target, vector<int>& nums) {

​    int i=0,j=0;//滑动窗口的前沿和后沿

​    int sum=0,sublength;//sublength为当前找到满足条件的窗口长度

​    int result=INT32_MAX;

​    for(j;j<nums.size();j++){

​      sum+=nums[j];//右窗口往后

​      while(sum>=target){

​        sublength=j-i+1;

​        result=result<sublength?result:sublength;

​        sum-=nums[i++];//左窗口往后

​      }

​    }

​    return result==INT32_MAX?0:result;

  }

};

1.5.螺旋矩阵Ⅱ

定义好需要的变量,始终保持拐角处作为新的横纵数组。


class Solution {

public:

  vector<vector<int>> generateMatrix(int n) {

​    int loop=n/2;//螺旋的次数。例如n=3时,螺旋1次就可以

​    int startx=0,starty=0;//起始的坐标位置

​    int middle=n/2;//螺旋的最中心位置。对于奇数的矩阵,最中心位置需要单独赋值

​    vector<vector<int>> res=vector(n,vector<int>(n,0));//创建二维数组,数据为0

​    int count=1,sublength=1;//count为填补的数字,sublength为遍历的数组长度



​    while(loop--){

​      int i=startx,j=starty;

​      //从左至右

​      for(j=starty;j<n-sublength;j++)

​        res[startx][j]=count++;

​      //从上至下

​      for(i=startx;i<n-sublength;i++)

​        res[i][j]=count++;

​      //从右至左

​      for(;j>starty;j--)

​        res[i][j]=count++;

​      //从下至上

​      for(;i>startx;i--)

​        res[i][j]=count++;



​      startx++;

​      starty++;



​      sublength+=1;



​    }

​    if(n%2!=0)

​      res[middle][middle]=count;

​    return res;

  }

};

2.1移除链表元素


//注意c++链表的格式

class Solution {

public:

  ListNode* removeElements(ListNode* head, int val) {

​    ListNode* vrhead=new ListNode(0);

​    ListNode* q;

​    vrhead->next=head;

​    ListNode* p=vrhead;

​    while(p->next != NULL){

​      if(p->next->val==val){

​        q=p->next;

​        p->next=q->next;

​        delete q;

​      }

​      else

​        p=p->next;

​    }

​    head=vrhead->next;

​    delete vrhead;

​    return head;

  }

};

2.2设计链表


class MyLinkedList {
public:
    struct LinkedNode{
        int val;
        LinkedNode* next;
        LinkedNode(int val):val(val),next(nullptr){}
    };

​    MyLinkedList() {
​        _dummyhead = new LinkedNode(0);
​        _size=0;
​    }
​    
​    int get(int index) {
​        LinkedNode* p=_dummyhead->next;
​        if(index>(_size-1)||index<0)
​            return -1;
​        while(index--){                              
​            p=p->next;
​        }
​        return p->val;
​    }
​    
​    void addAtHead(int val) {
​        LinkedNode* newNode = new LinkedNode(val);
​        newNode->next=_dummyhead->next;
​        _dummyhead->next = newNode;
​        _size++;
​    }
​    
​    void addAtTail(int val) {
​        LinkedNode* p=_dummyhead->next;
​        LinkedNode* NewNode = new LinkedNode(val);
​        while(p->next!=nullptr)
​            p=p->next;
​        p->next = NewNode;
​        _size++;
​    }
​    
​    void addAtIndex(int index, int val) {
​        LinkedNode* p=_dummyhead;
​        LinkedNode* NewNode = new LinkedNode(0);
​        NewNode->val = val;
​        if(index>_size)
​            return;
​        f(index<0)
​            return 0;
​        while(index--)
​            p=p-next;
​        NewNode->next = p->next;
​        p-next = NewNode;
​        _size++;
​    }
​    
​    void deleteAtIndex(int index) {
​        LinkedNode* p=_dummyhead;
​        LinkedNode* q;
​        if(index<0||index>(_size-1))
​            return;
​        while(index--)
​            p=p-next;
​        q=p->next;
​        delete q;
​        q=nullptr;
​        _size--;
​        
​    }
​    
​    void printLinkedList() {
​        LinkedNode* cur = _dummyHead;
​        while (cur->next != nullptr) {
​            cout << cur->next->val << " ";
​            cur = cur->next;
​        }
​        cout << endl;
​    }

private:
    int _size;
    LinkedNode* _dummyHead;

};
posted @ 2023-10-23 20:03  Ref-rain-  阅读(10)  评论(0)    收藏  举报