力扣刷题总结

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

书要是记录着一些日常的作题总结

提示:以下是本篇文章正文内容,下面案例可供参考

一、二分查找(2020-09-30)

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1

代码如下(示例):

        int left=0;
        int right=nums.size()-1;
        int mid;
        while(left<=right){//这个地方为边界条件
           mid=(left+right)/2; #有时候为了避免无限循环,也写成:mid=left+(right-left)/2
        if(target==nums[mid]){
            return mid;
        }
        else if(nums[mid]>target){
            right=mid-1;
        }
        else if(nums[mid]<target){
            left=mid+1;
        }
        }
 

如果还要目标不在数组里面,还要找一个位置,可以写成:

  if(nums[mid]<target){
            return mid+1;
        }
        if(nums[mid]>target){
            return mid;
        }

二、双指针(2021-10-02)

1,快慢指针

1,找到链表的中间节点,这个时候需要slow指针,一个fast,slow每次移动 一步,fast每次移动两步,这样,当fast移动到末尾时候,slow刚好是中间节点。
class Solution {
public:
    ListNode* middleNode(ListNode* head) {
    ListNode*slow=head;
    ListNode*fast=head;
   
        while(fast!=nullptr&&fast->next!=nullptr){
            slow=slow->next;
            fast=fast->next->next;
        }
    
    return slow;
    }
};
2,删除链表倒数第n个节点。快指针比慢指针夺走n步,然后当快指针走到末尾的时候, 慢指针就刚好是倒数第n位。
class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode* dum=new ListNode(0,head);//定义一个新的节点,值为0
        ListNode*first=head;
        ListNode*second=dum;
        
       for(int i=0;i<n;i++){
            first=first->next;
        }
      while(first){
          first=first->next;
          second=second->next;
      }
        
       
        second->next=second->next->next;//删除节点
        ListNode*ans=dum->next;
        delete dum;
        return ans;

    }
};

2,两头的反指针,一个指针在开头,一个在末尾

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
    void reverseString(vector<char>& s) {
        int p=0,q=s.size()-1;
        while(p<q){
            swap(s[p],s[q]);
            ++p;
            --q;
        }
反转字符串的单词
  string reverseWords(string s) {
        int p=0,q;
        for(int i=0;i<s.size();i++){

            if(s[i]==' '){//遇到空格就把之前的反转一下
             q=i-1;
             s=rolate(s,p,q);
             p=i+1;
            }
           else if(i==s.size()-1){//最后一个单词反转
             q=i;
             s=rolate(s,p,q);
             p=i+1;
            }
        }
       
return s;

    }
    string rolate(string s,int p,int q){
         while(p<q){
            swap(s[p],s[q]);
            ++p;
            --q;
        }
        return s;
    }
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
public:
    void moveZeroes(vector<int>& nums) {
        int p=0,q=0;
        while(q<nums.size()){
            if(nums[q]!=0){
                nums[p]=nums[q];
                p++;
               
            }
              q++;  
        }
        if(p<nums.size()){
            for(int i=p;i<nums.size();i++){
                nums[i]=0;
            }

        }
    }

三、滑动窗口

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值