算法进修Day-8

算法进修Day-8

15. 三数之和

难度:中等
题目要求:
给定一个整数数组nums,判断是否存在三元组 [nums[i],nums[j],nums[k]] 满足 i != j != k,同时还满足 nums[i] + nums[j] + nums[k] == 0
返回所有和为0且不重复的三元组

示例1

输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]

示例2

输入:nums = [0,1,1]
输出:[]

示例3

输入:nums = [0,0,0]
输出:[[0,0,0]]

题解

最开始的想法:先排序,从数组第一个元素开始遍历,遍历到倒数第三个元素,定义一个左指针和一个右指针,左指针为第一层循环值 + 1,右指针为最后一个元素下标,定义三数之和为当前循环数组元素,左指针下标代表元素,右指针代表元素,当左指针小于右指针时,如果和为零,那么就将结果添加到列表中,如果和小于零,左指针自增,如果大于零,右指针自减。

想法代码

public static IList> ThreeSum(int[] nums)
    {
        IList> result = new List>();
        int len = nums.Length;
        if (len < 3)
        {
            return result;
        }
        Array.Sort(nums);
        for (int i = 0; i < len - 2; i++)
        {
            if (nums[i] > 0)
            {
                break;
            }
            if (i > 0 && nums[i] == nums[i - 1])
            {
                continue;
            }
            int left = i + 1;
            int right = len - 1;
            while (left < right)
            {
                int sum = nums[i] + nums[left] + nums[right];
                if (sum == 0)
                {
                    result.Add(new List() { nums[i], nums[left], nums[right] });
                    while (left < right && nums[left] == nums[left + 1])
                    {
                        left++;
                    }
                    while (left < right && nums[right] == nums[right - 1])
                    {
                        right--;
                    }
                    left++;
                    right--;
                }
                else if (sum < 0) left++;
                else if (sum > 0) right--;
            }
        }
        return result;
    }

最接近的三数之和

难度:中等
题目要求:
给定一个长度为n的整数数组nums和一个目标值target,从nums中选出三个整数,使他们的和与target最接近
返回这三个数的和

示例1

输入:nums = [-1,2,1,-4],target = 1
输出:2

示例2

输入:nums = [0,0,0],target = 1
输出:0

题解

最开始的想法:先对数组进行排序,从数组第一个元素开始遍历,遍历到倒数第三个元素,定义一个左指针和一个右指针,左指针为第一层循环值 + 1,右指针为最后一个元素下标,定义三数之和为当前循环数组元素,左指针下标代表元素,右指针代表元素,当左指针小于右指针时,如果和与目标值相等,直接返回目标值,如果比目标值大,右指针自减,如果比目标值小,左指针自增

想法代码

public static int ThreeSumClosest(int[] nums, int target)
    {
        Array.Sort(nums);
        int res = int.MaxValue;
        for (int i = 0; i < nums.Length - 2; i++)
        {
            int left = i + 1;
            int right = nums.Length - 1;
            while (left < right)
            {
                int sum = nums[left] + nums[right] + nums[i];
                if (sum == target)
                {
                    return target;
                }
                else if (sum > target)
                {
                    right--;
                }
                else
                {
                    left++;
                }
                if (Math.Abs(sum - target) < Math.Abs(res - target))
                {
                    res = sum;
                }
            }
        }
        return res;
    }

你可能感兴趣的:(算法进修,算法,leetcode,c#)