当前位置:网站首页>406 double pointer (27. remove elements, 977. square of ordered array, 15. sum of three numbers, 18. sum of four numbers)

406 double pointer (27. remove elements, 977. square of ordered array, 15. sum of three numbers, 18. sum of four numbers)

2022-06-23 07:07:00 liufeng2023

27. Remove elements

 Insert picture description here

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

 Insert picture description here

977. The square of an ordered array

 Insert picture description here

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

 Insert picture description here

15. Sum of three numbers

 Insert picture description here

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]});
                    // duplicate removal , stay i Without change , Only right-- and left++ It is possible to get the next sum 0 Array of ,nums Is increasing !
                    while (left < right && nums[right] == nums[right-1]) right--;
                    while (left < right && nums[left] == nums[left+1]) left++;

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

 Insert picture description here

18. Sum of four numbers

 Insert picture description here

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++)
        {
    
            // Pruning treatment 
            if (nums[k] > target && (nums[k] >= 0 || target >= 0))
            {
    
                break;
            }

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

            //nums[i]
            for (int i = k + 1; i < nums.size(); i++)
            {
    
                // Secondary pruning treatment 
                if (nums[k] + nums[i] > target && (nums[k] + nums[i] >= 0 || target >= 0))
                {
    
                    break;
                }

                // The right way to get rid of duplication 
                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;
    }
};

 Insert picture description here

原网站

版权声明
本文为[liufeng2023]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/174/202206230615585695.html