当前位置:网站首页>406-双指针(27. 移除元素、977.有序数组的平方、15. 三数之和、18. 四数之和)

406-双指针(27. 移除元素、977.有序数组的平方、15. 三数之和、18. 四数之和)

2022-06-23 06:16:00 liufeng2023

27. 移除元素

在这里插入图片描述

class Solution {
    
public:
    int removeElement(vector<int>& nums, int val) {
    
        
        int i = 0;
        int j = 0;

        for(; i < nums.size(); i++)
        {
    
            if(nums[i] == val)
            {
    
                continue;
            }

            nums[j++] = nums[i];
        }
        return j;
    }
};

在这里插入图片描述

977.有序数组的平方

在这里插入图片描述

class Solution {
    
public:
    vector<int> sortedSquares(vector<int>& nums) {
    
        vector<int> v(nums.size(), 0);

        for(int i = 0; i < nums.size(); i++)
        {
    
            v[i] = nums[i]*nums[i];
        }

        sort(v.begin(), v.end());
        return v;
    }
};

在这里插入图片描述

15. 三数之和

在这里插入图片描述

class Solution {
    
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
    

        vector<vector<int>> result;

        sort(nums.begin(), nums.end());


        for (int i = 0; i < nums.size(); i++)
        {
    
            if (nums[i] > 0)
            {
    
                return result;
            }

            if (i > 0 && nums[i] == nums[i - 1])
            {
    
                continue;
            }

            int left = i + 1;
            int right = nums.size() - 1;

            while (right > left)
            {
    
                if (nums[i] + nums[left] + nums[right] > 0)
                {
    
                    right--;
                    while (right > left && nums[right] == nums[right + 1]) right--;
                }
                else if (nums[i] + nums[left] + nums[right] < 0)
                {
    
                    left++;
                    while (right > left && nums[left] == nums[left - 1])   left++;
                }
                else
                {
    
                    result.push_back(vector<int>{
    nums[i], nums[left], nums[right]});
                    //去重,在i不变的情况下,只有right--和left++才有可能得到下一个和为0的数组,nums是递增的!
                    while (left < right && nums[right] == nums[right-1]) right--;
                    while (left < right && nums[left] == nums[left+1]) left++;

                    right--;
                    left++;
                }
            }
        }
        return result;
    }
};

在这里插入图片描述

18. 四数之和

在这里插入图片描述

class Solution {
    
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
    
        vector<vector<int>> result;
        sort(nums.begin(), nums.end());

        //nums[k]
        for (int k = 0; k < nums.size(); k++)
        {
    
            //减枝处理
            if (nums[k] > target && (nums[k] >= 0 || target >= 0))
            {
    
                break;
            }

            //去重
            if (k > 0 && nums[k] == nums[k - 1])
            {
    
                continue;
            }

            //nums[i]
            for (int i = k + 1; i < nums.size(); i++)
            {
    
                //二级减枝处理
                if (nums[k] + nums[i] > target && (nums[k] + nums[i] >= 0 || target >= 0))
                {
    
                    break;
                }

                //正确去重方法
                if (i > k + 1 && nums[i] == nums[i - 1])
                {
    
                    continue;
                }

                int left = i + 1;
                int right = nums.size() - 1;

                while (right > left)
                {
    
                    if (nums[k] + nums[i] > target - (nums[left] + nums[right]))
                    {
    
                        right--;
                        while (right > left && nums[right] == nums[right + 1]) right--;
                    }
                    else if (nums[k] + nums[i] < target - (nums[left] + nums[right]))
                    {
    
                        left++;
                        while (right > left && nums[left] == nums[left - 1])   left++;
                    }
                    else
                    {
    
                        result.push_back(vector<int>{
    nums[k], nums[i], nums[left], nums[right]});

                        while (right > left && nums[left] == nums[left + 1]) left++;
                        while (right > left && nums[right] == nums[right - 1]) right--;

                        right--;
                        left++;
                    }

                }
            }
        }
        return result;
    }
};

在这里插入图片描述

原网站

版权声明
本文为[liufeng2023]所创,转载请带上原文链接,感谢
https://blog.csdn.net/Edward_LF/article/details/125402447