1. 程式人生 > 其它 >Leetcode 16. 最接近的三數之和

Leetcode 16. 最接近的三數之和

技術標籤:雙指標Leetcode

在這裡插入圖片描述
思路:排序+雙指標

class Solution {
    public int threeSumClosest(int[] nums, int target) {
    	Arrays.sort(nums);
        int ans = nums[0] + nums[1] + nums[2];
        for (int i = 0; i < nums.length; i++) {
            int l = i + 1, r = nums.length - 1;
            while (l < r)
{ int sum = nums[i] + nums[l] + nums[r]; if (Math.abs(sum - target) < Math.abs(target - ans)){ ans = sum; } if (sum == target){ return sum; }else if (sum < target){ l++
; }else{ r--; } } } return ans; } }

優化:排序後可能存在相等的值,可以直接跳過相等的值,注意指標移動的邊界條件

class Solution {
    public int threeSumClosest(int[] nums, int target) {
        Arrays.sort(nums);
        int ans = nums[0] + nums[1] + nums[
2]; for (int i = 0; i < nums.length; i++) { // 保證和上一次列舉的元素不相等 if (i > 0 && nums[i] == nums[i - 1]){ continue; } int l = i + 1, r = nums.length - 1; while (l < r){ int sum = nums[i]+ nums[l] + nums[r]; if (sum == target) return sum; // 根據差值的絕對值來更新答案 if (Math.abs(target - sum) < Math.abs(target - ans)){ ans = sum; } if (sum < target){ // 如果sum小於target,移動 l 對應的指標 int l0 = l + 1; while (l0 < r && nums[l0] == nums[l]){ // 移動到下一個不相等的元素 l0++; } l = l0; }else { // 如果sum大於target,移動 r 對應的指標 int r0 = r - 1; while (l < r0 && nums[r] == nums[r0]){ r0--; } r = r0; } } } return ans; } }