leetcode算法练习【16】最接近的三数之和

所有题目源代码:Git地址

题目

给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。

例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.

与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).

方案,类似0015


class Solution {
        public int threeSumClosest(int[] nums, int target) {
            //排序
            Arrays.sort(nums);
            //初始化
            int left = 1;
            int right = nums.length - 1;
            int ans = Integer.MAX_VALUE;
            if (nums[0]+nums[1]+nums[2]>target){
                return  nums[0]+nums[1]+nums[2];
            }else if (nums[right]+nums[right-1]+nums[right-2]<target){
                return nums[right]+nums[right-1]+nums[right-2];
            }else {
                Label:
                for (int i = 0; i < nums.length - 2; i++) {
                    left = i+1;
                    right = nums.length-1;
                    if (nums[i]+nums[i+1]+nums[i+2]>target&&Math.abs(nums[i] + nums[i+1] + nums[i+2]-target)<Math.abs(ans-target)){
                        ans = nums[i] + nums[i+1] + nums[i+2];
                        break Label;
                    }else {
                    while (right>left){
                        if (Math.abs(nums[right] + nums[i] + nums[left]-target)<Math.abs(ans-target)){
                            ans = nums[right] + nums[i] + nums[left];
                        }
                        if (nums[right] + nums[i] + nums[left] >target ) {
                            //xyz>target==>变小
                            right--;
                        }else if (nums[right] + nums[i] + nums[left] <target ) {
                            //xyz<target==>变大
                            left++;
                        } else if (nums[right] + nums[i] + nums[left]  ==target ) {
                            return target;
                        }
                    }
                }}
            }
            return ans;
        }
    }
复杂度计算
  • 时间复杂度:O(n2)
  • 空间复杂度:O(1)

改进思路

  • 查找这边编程二分可能会好点时间复杂度降低到O(nlogn)

基本知识杂记

关于Java中的break
  • demo 如下,当j==1会直接跳出labelB下的循环,也就是跳出所有循环
public static void main(String[] args) {
        lableB:
        for(int i=0;i<3;i++){
            lableA:
            for(int j=0;j<3;j++){
                System.out.println(j);
                if(j==1){
                    break lableB;
                }
            }
        }
        System.out.println("over!");
    }
发布了135 篇原创文章 · 获赞 187 · 访问量 21万+

猜你喜欢

转载自blog.csdn.net/symuamua/article/details/105632896