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