数据结构与算法练习44

四数之和

在这里插入图片描述

解题思路:

思路和之前的三数之和一模一样,就是每次固定的指针多了一个,每次双指针循环完先移动这个再移动第一个指针。

代码:

        public static IList<IList<int>> FourSum(int[] nums, int target)
        {
            IList<IList<int>> results = new List<IList<int>>();
            if (nums.Length < 4)
                return results;//先判断nums元素个数。
            Array.Sort(nums);//排序。
            int first = 0;//固定的第一个指针。
            while(first<nums.Length-3)
            {
                int second = first + 1;//固定的第二个指针。
                while(second<nums.Length-2)
                {
                    int left = second + 1;//每次移动的左指针。
                    int right = nums.Length - 1;//每次移动的右指针。
                    while(left<right)
                    {                       
                        int lgx = nums[first] + nums[second] + nums[left] + nums[right];
                        if(lgx<target)
                        {
                            left++;
                        }
                        else if(lgx>target)
                        {
                            right--;
                        }//不等的情况只需要移动左右指针之一。
                        else
                        {
                            IList<int> result = new List<int>();//找到一组就新建一个链表,加进去。
                            result.Add(nums[first]);
                            result.Add(nums[second]);
                            result.Add(nums[left]);
                            result.Add(nums[right]);
                            results.Add(result);
                            while(left<right&&nums[left]==nums[left+1])
                            {
                                    left++;
                            }
                            while(left<right&&nums[right-1]==nums[right])
                            {
                                right--;
                            }//每次跳过与之前相同的数,避免重复。
                            left++;
                            right--;
                        }//相等的情况要同时移动左右指针。还有避免重复。
                    }
                    while (second < nums.Length - 2 && nums[second] == nums[second + 1]) 
                    {
                        second++;
                    }//避免重复。
                    second++;
                }
                while (first < nums.Length - 2 && nums[first] == nums[first + 1])
                {
                    first++;
                }//避免重复。
                first++;
            }
            return results;
        }

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值