leetcode做题记录0016

leetcode 0016

说明

只是为了记录一下,不求多快,也不深究。

会简要描述思路,代码中不写注释。

如碰到不会做的用了别人代码会在博客中标出。

题目描述

在这里插入图片描述

结果

在这里插入图片描述

思路

先排个序。

指针i遍历从1到len-2。

j遍历i的左边,k遍历i的右边,双重循环。

三数之和大于target,则k向左移;

三数之和小于target,则j向右移;

index数组用于记录当前最优的三个指针。

mincount用于记录当前最小差距。

代码

class Solution {
    public int threeSumClosest(int[] nums, int target) {
        int len = nums.length;
        if(len == 0 || len == 1 || len == 2) {
        	return 0;
        }
        if(len == 3) {
        	return nums[0]+nums[1]+nums[2];
        }
        Arrays.sort(nums);
		int minCount = Math.abs(nums[0]+nums[1]+nums[len-1]-target);
		int[] index = {0,1,len-1};
		for(int i=1;i<len-1;i++) {
			int j = 0,k = len-1;
			while(j<i&&k>i) {
				int temp = nums[i]+nums[j]+nums[k]-target;
				if(Math.abs(temp)<minCount) {
					index[0] = j;
					index[1] = i;
					index[2] = k;
					minCount = Math.abs(temp);
				}
				if(temp == 0) {
					return target;
				}else if(temp>0){
					k--;
				}else {
					j++;
				}
			}
		}
		return nums[index[0]]+nums[index[1]]+nums[index[2]];
    }
}
发布了77 篇原创文章 · 获赞 1 · 访问量 2084

猜你喜欢

转载自blog.csdn.net/Paul_1i/article/details/104329494