c++ 双指针算法

双指针问题,解题技巧:

11. 盛最多水的容器

class Solution {
public:
    int maxArea(vector<int>& height) {
        //双指针算法
        int ans = 0;
        int left =0;
        int right=height.size()-1;
        while(left<right)
        {
           int minH =min(height[left],height[right]);
           ans =max(ans,(right-left)*minH);
          if(height[left]>height[right])
          {
              right--;
          }
          else
          {
              left++;
          }
        }
        return ans;
    }
};

15. 三数之和

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        int n = nums.size();
        sort(nums.begin(), nums.end());
        vector<vector<int>> ans;
        for(int i=0;i<n-2;i++)
        {
            if(i>0&&nums[i]==nums[i-1])
            {
              continue;
            }
            int right=n-1;
            
            for(int left =i+1;left<nums.size();left++)
            {
                if(left>i+1&&nums[left-1]==nums[left])
                {
                    continue;
                }

                while(left<right&&nums[left]+nums[right]+nums[i]>0)
                {
                    right--;
                }
                if(left==right)
                {
                    break;
                }
                if(nums[left]+nums[right]+nums[i]==0)
                {
                    ans.push_back({nums[i],nums[left],nums[right]});
                }
            }
        }
        return ans;

    }
};

19. 删除链表的倒数第 N 个结点

class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        
        if(head==nullptr)
        {
            return head;
        }
        ListNode* node =new ListNode(0,head); //找一个梢兵
        ListNode* left =node;
        ListNode* right =left;
        ListNode* deletNode=nullptr;

        for(int i=0;i<n;i++)
        {
            right=right->next;
            if(right==nullptr)
            {
                break;
            }
        }

        while(right!=nullptr&&right->next!=nullptr)
        {
            left=left->next;
            right=right->next;
        }
        deletNode=left->next;
        left->next=deletNode->next;
        deletNode->next=nullptr;
        head=node->next;
        delete node;
        return head;
    }
};

26. 删除有序数组中的重复项

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
         int ans =nums.size();
         if(ans==0||ans==1)
         {
             return ans;
         }
         int left =0;
         for(int right=1;right<nums.size();right++)
         {
            if(nums[left]!=nums[right])
            {
                nums[++left]=nums[right];
            }
         }
         return left+1;

    }
};

27. 移除元素

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int n =nums.size();
        if(n==0)
        {
            return 0;
        }

        int left =0;
        for(int right=0;right<n;right++)
        {
            if(nums[right]!=val)
            {
                nums[left++]=nums[right];
            }
        }
        return left;
    }
};

28. 找出字符串中第一个匹配项的下标

    int strStr(string haystack, string needle) {
        
        int ret =-1;
        int flag =1;
        int n=haystack.size();
        int m=needle.size();
        for(int i=0;i<=n-m;i++)
        {  
            flag = 1;
            for(int j=0;j<needle.size();j++)
            {
                if(haystack[i+j]!=needle[j])
                {   
                    flag=0;
                    break;
                }  
            }
            if(flag)
            {
                return  i;
            }
        }
        return ret;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值