LeetCode 刷題記錄(16、17、18)—Java語言

_Traveler發表於2018-05-25

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;  
    }  
}  

相關文章