三数和的问题

//三数和为0的问题。要求去重,并且输出数字有序。public List<List<Integer>> threeSum(int[] nums)
    {
        Arrays.sort(nums);
        List<List<Integer>> lists = new ArrayList<List<Integer>>();
        //对于i去重,因为p在i后面,所以不能往后去重,可能会把p的值去掉,所以要往前去重。
        for(int i = 0; i < nums.length; i ++)
        {
            if(i>0&&nums[i] == nums[i-1])
            {
                continue;
            }
            int p = i+1, q = nums.length - 1;
            while(p < q)
            {
                int sum = nums[i]+nums[p]+nums[q];
                if(sum == 0)
                {
                    List<Integer> list = new ArrayList<>();
                    list.add(nums[i]);
                    list.add(nums[p]);
                    list.add(nums[q]);
                    lists.add(list);
                    //p去重很巧妙,先自加,然后判断之前p的值和自加后的值是不是相等,如果相等,再次自加,同时也避免的去重时和q重叠。
                    while(++p < q && nums[p] == nums[p-1])
                    {
                    }
                    while(--q > p && nums[q] == nums[q+1])
                    {
                    }
                }
                if(sum < 0)
                {
                    p++;
                }
                if(sum > 0)
                {
                    q--;
                }
            }
        }
        return lists;
    } 
//三数和最接近某个值public int threeSumClosest(int[] nums, int target) {
            Arrays.sort(nums);
            int temp = 0;
            int dist = Integer.MAX_VALUE;
            for(int i = 0; i < nums.length; i ++)
            {
                if(i > 0 && nums[i]==nums[i-1])
                {
                    continue;
                }
                int p = i + 1, q = nums.length-1;
                while(p < q)
                {
                    int sum = nums[i] + nums[p] + nums[q];
                    if(sum > target)
                    {
                        if((sum - target) < dist)
                        {
                            dist = sum - target;
                            temp = sum;
                        }
                        q--;
                    }
                    else if(sum < target)
                    {
                        if((target - sum) < dist)
                        {
                            dist = target - sum;
                            temp = sum;
                        }
                        p++;
                    }
                    else
                    {
                        return sum;
                    }
                }
            }
            return temp;
        }
时间: 2024-10-07 21:50:00

三数和的问题的相关文章

[LintCode/LeetCode]——两数和、三数和、四数和

LintCode有大部分题目来自LeetCode,但LeetCode比较卡,下面以LintCode为平台,简单介绍我AC的几个题目,并由此引出一些算法基础. 1)两数之和(two-sum) 题目编号:56,链接:http://www.lintcode.com/zh-cn/problem/two-sum/ 题目描述: 给一个整数数组,找到两个数使得他们的和等于一个给定的数 target. 你需要实现的函数twoSum需要返回这两个数的下标, 并且第一个下标小于第二个下标.注意这里下标的范围是 1

lintcode 中等题: 3 Sum II 三数之和II

题目 三数之和 II 给一个包含n个整数的数组S, 找到和与给定整数target最接近的三元组,返回这三个数的和. 样例 例如S = [-1, 2, 1, -4] and target = 1.  和最接近1的三元组是 -1 + 2 + 1 = 2. 注意 只需要返回三元组之和,无需返回三元组本身 解题 和上一题差不多,程序也只是稍微修改了 public class Solution { /** * @param numbers: Give an array numbers of n integ

三数中找最大值

static void Main11三数中找最大值(string[] args) { //1.输入三个数,找出最大的输出 Console.WriteLine("请输入第一个数"); int a = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("请输入第二个数"); int b = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("

[LeetCode] 3Sum Closest 最近三数之和

Given an array S of n integers, find three integers in S such that the sum is closest to a given number, target. Return the sum of the three integers. You may assume that each input would have exactly one solution. For example, given array S = {-1 2

LeetCode OJ:3Sum Closest(最接近的三数之和)

Given an array S of n integers, find three integers in S such that the sum is closest to a given number, target. Return the sum of the three integers. You may assume that each input would have exactly one solution. For example, given array S = {-1 2

(c语法百题18)三数排序

知识点: 借用第四变量对三个变量进行排序. 排序的算法,if语句 内容: 任意输入三个数 a.b.c,按由大到小的顺序打印出来 输入说明: 一行 三个整数 输出说明: 一行三个整数,由大到小 1 #include <stdio.h> 2 int main() 3 { 4 int a,b,c,t; 5 scanf("%d %d %d",&a,&b,&c); 6 if(a<b) 7 { 8 t=b; 9 b=a; 10 a=t; 11 } 12 i

【数据结构】大量数据(20万)的快速排序的递归与非递归算法、三数取中思想

快速排序的挖坑法与prev.cur法,我们在上一篇博客的第6个排序中讲的非常详细,http://10740184.blog.51cto.com/10730184/1774508[数据结构]常用排序算法(包括:选择排序,堆排序,冒泡排序,选择排序,快速排序,归并排序) 有兴趣的话,相信聪明的你,一看就会秒懂快速排序的思想. 下面,我们将快速排序优化: 1.三数取中来优化快速排序 优化原因: 快速排序的擦差不多每次将序列一分为二,时间复杂度是O(n*lgn). 我们思考,快速排序的时间复杂度是O(n

[LeetCode] 16. 3Sum Closest 最近三数之和

Given an array S of n integers, find three integers in S such that the sum is closest to a given number, target. Return the sum of the three integers. You may assume that each input would have exactly one solution. For example, given array S = {-1 2

LeeCode数组第15题三数之和

题目:三数之和 内容: 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组. 注意:答案中不可以包含重复的三元组. 例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4], 满足要求的三元组集合为: [ [-1, 0, 1], [-1, -1, 2] ] 思路:题目实现可分为两个步骤,分别是(1)寻找三个满足条件的元素(2)去重复对于第一个小问题,首先考虑三个for循