LeetCode 刷题记录(16、17、18)—Java语言

16. 最接近的三数之和

题目

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

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

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

思路

先将所有数据排序,选定一个数,将target减去这个数然后即化简为找出剩下的数中的两个数之和与这个结果最接近。这样就很好解决了。

代码

class Solution {
    public int threeSumClosest(int[] nums, int target) {
        Arrays.sort(nums);
        int i,j,k,result=0,reserve;
        int min=Integer.MAX_VALUE;
        for(i=0;i<nums.length-2;i++){
            if(i!=0&&nums[i]==nums[i-1])
                continue;
            else if(min!=Integer.MAX_VALUE&&nums[i]>target)
                break;
            j=i+1;
            k=nums.length-1;
            reserve=target-nums[i];
            while(j<k){
                if(Math.abs(reserve-nums[j]-nums[k])<min){
                    result=nums[i]+nums[j]+nums[k];
                    min=Math.abs(reserve-nums[j]-nums[k]);
                }
                if(nums[j]+nums[k]<reserve)j++;
                else k--;

            }
        }
        return result;
    }
}

17. 电话号码的字母组合

题目

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

这里写图片描述

示例:

输入:”23”
输出:[“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”].
说明:
尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。

思路

模拟题目,考验基本语法

代码

class Solution {
    String[] strarr = new String[] {"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
    public List<String> letterCombinations(String digits) {
        List<String> ans = new ArrayList<String>();
        if(digits.length() == 0){
            return ans;
        }
        work(digits,0,"",ans);
        return ans;
    }

    public void work(String target,int count,String str,List<String> ans){
        if(target.length() == count){
            ans.add(str);
            return;
        }
        int temp = target.charAt(count) - '0';
        if(temp == 0 || temp == 1){
            work(target,count+1,str,ans);
        }else{
            for(int i = 0;i<strarr[temp].length();i++){
                work(target,count+1,str+strarr[temp].charAt(i),ans);
            }
        }
    }
}

18. 四数之和

题目

给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。

注意:

答案中不可以包含重复的四元组。

示例:

给定数组 nums = [1, 0, -1, 0, -2, 2],和 target = 0。

满足要求的四元组集合为:
[
[-1, 0, 0, 1],
[-2, -1, 1, 2],
[-2, 0, 0, 2]
]

思路

bfs算法

代码

public class Solution {  
    private void find(int[] nums, int from, int[] quad, int step, int target, List<List<Integer>> results) {  
        if (step == 2) {  
            int i=from, j=nums.length-1;  
            while (i<j) {  
                if (nums[i] + nums[j] < target) i++;  
                else if (nums[i] + nums[j] > target) j --;  
                else if (i>from && nums[i]==nums[i-1]) i ++;  
                else if (j<nums.length-1 && nums[j]==nums[j+1])j--;  
                else {
                    quad[2] = nums[i];  
                    quad[3] = nums[j];  
                    List<Integer> result = new ArrayList<>(4);  
                    for(int k=0; k<4; k++) result.add(quad[k]);  
                    results.add(result);  
                    i ++;   
                    j --;  
                }  
            }  
            return;  
        }  
        for(int i=from; i<=nums.length-(4-step); i++) {  
            if (i>from && nums[i]==nums[i-1]) continue;  
            quad[step] = nums[i];  
            find(nums, i+1, quad, step+1, target - nums[i], results);  
        }  
    }  
    public List<List<Integer>> fourSum(int[] nums, int target) {  
        Arrays.sort(nums);
        List<List<Integer>> results = new ArrayList<>(); 
        find(nums, 0, new int[4], 0, target, results);  
        return results;  
    }  
}  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值