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;
}
}
相關文章
- 刷題記錄(C語言)01C語言
- LeetCode刷題記錄LeetCode
- leetcode刷題記錄 661~LeetCode
- 【程式設計大賽刷題記錄】C語言 06程式設計C語言
- 【程式設計大賽刷題記錄】C語言 02程式設計C語言
- LeetCode刷題記錄——day1LeetCode
- LeetCode刷題記錄——day2LeetCode
- LeetCode刷題記錄——day3LeetCode
- LeetCode刷題記錄——day4LeetCode
- LeetCode刷題記錄——day5LeetCode
- LeetCode-劍指Offer刷題記錄LeetCode
- LeetCode刷題記錄與題解(C++版本)LeetCodeC++
- Leetcode刷題筆記8.12-8.16LeetCode筆記
- BUU刷題記錄
- 記錄刷題日常
- LeetCode 刷題筆記LeetCode筆記
- leetcode刷題筆記LeetCode筆記
- LeetCode刷題日記 416. 分割等和子集LeetCode
- 面試刷題偶有記錄面試
- [雜項] 刷題記錄
- Codeforces 刷題記錄
- leetcode刷題記錄:演算法(六)BFS&DFSLeetCode演算法
- 刷題記錄:劍指offer+遇到的筆試題+LeetCode筆試LeetCode
- leetcode刷題筆記605LeetCode筆記
- leetcode刷題記錄1041-1050 python版LeetCodePython
- leetcode每日一題刷題記錄(10.26-10.30)LeetCode每日一題
- 軟考刷題記錄3
- 軟考刷題記錄5
- 劍指offer刷題記錄
- leetcode刷題之1160拼寫單詞 java題解(超詳細)LeetCodeJava
- ctfshow刷題記錄-cry方向-1
- ctfshow刷題記錄-社工篇-1
- Leetcode刷題面試題 16.14. 最佳直線LeetCode面試題
- leetcode刷題筆記(3)(python)LeetCode筆記Python
- LeetCode刷題筆記9.2-9.9LeetCode筆記
- leetcode刷題筆記8.5-8.9LeetCode筆記
- leetcode刷題記錄:演算法(三)滑動視窗演算法LeetCode演算法
- [LeetCode刷題筆記] 關於LeetCode的前言LeetCode筆記