LeetCode
来源:互联网 发布:淘宝网液晶电视机 编辑:程序博客网 时间:2024/04/29 05:22
题目
输入一个数组和一个目标值target,返回数组中任意3个数的和最接近target的值。
思路
和 3Sum 类似,每次先确定一个数的值,然后计算选出来的两个数和当前确定的数的和,进行比较,如果和目标值相同,则返回目标值,否则选取更接近的值作为结果值。继续计算,知道找到和目标值相同的值或者计算完毕。
代码
public int threeSumClosest(int[] nums, int target) { int res = 0; if (nums == null || nums.length < 3) { return res; } ArrayList<Integer> list = new ArrayList<>(); for (int i : nums) { list.add(i); } Collections.sort(list); // 初始化res为前三个数之和 res = list.get(0) + list.get(1) + list.get(2); for (int i = 0 ; i < nums.length - 2 ;) { // 当前计算的3个数的和 int sum = 0; // 从i后一个结点开始查找 int left = i + 1; int right = nums.length - 1; while (left < right) { sum = list.get(i) + list.get(left) + list.get(right); // 如果当前3个数的值更接近target if (Math.abs(sum - target) < Math.abs(res - target)) { res = sum; } // 如果找到的和目标相等,直接返回 if (sum == target) { return target; } else if (sum < target) { int num = list.get(left); while (num == list.get(left) && left < right) { left++; } } else { int num = list.get(right); while (num == list.get(right) && right > left) { right--; } } } // 跳过重复的 int num = list.get(i); // 注意判断顺序,如果颠倒了会抛出异常,应该先判断是否越界 while (i < nums.length && list.get(i) == num) { i++; } } return res;}
0 0
- leetcode
- [leetcode]
- LeetCode
- leetcode
- leetcode
- leetcode:
- leetcode:
- LeetCode
- leetcode
- LEETCODE
- leetcode
- leetCode
- leetcode
- [leetcode]
- LeetCode
- leetcode
- leetcode:
- leetcode
- Oracle 正则表达式函数学习
- linux下的错误码
- C/C++_log2000_继承的练习1
- 欢迎使用CSDN-markdown编辑器
- Lee的文章注记
- LeetCode
- CentOS端口重定向
- 返回顶部
- html5的canvas实现实时时钟
- c++中的访问属性,和继承方式,一些问题的总结
- 有关opencv的学习(17)—形态学滤波器检测边缘和角点
- ADB使用以及常见问题解决
- 适配器Stack----deque/Vector做空间配置器实现
- 第39级台阶