1.
給定一個整數數組 nums
和一個目標值 target
,請你在該數組中找出和爲目標值的那 兩個 整數,並返回他們的數組下標。
你可以假設每種輸入只會對應一個答案。但是,你不能重複利用這個數組中同樣的元素。
示例:
給定 nums = [2, 7, 11, 15], target = 9
因爲 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
class Solution {
public int[] twoSum(int[] nums, int target) {
int []ans=new int[2];
Map<Integer,Integer>mp=new HashMap<>();
for(int i=0;i<nums.length;i++){
mp.put(nums[i],i);
}
for(int i=0;i<nums.length;i++){
int k=target-nums[i];
if(mp.containsKey(k)&&i!=mp.get(k)){
ans[0]=i;
ans[1]=mp.get(k);
break;
}
}
return ans;
}
}
2.
給定一個已按照升序排列 的有序數組,找到兩個數使得它們相加之和等於目標數。
函數應該返回這兩個下標值 index1 和 index2,其中 index1 必須小於 index2。
說明:
- 返回的下標值(index1 和 index2)不是從零開始的。
- 你可以假設每個輸入只對應唯一的答案,而且你不可以重複使用相同的元素。
示例:
輸入: numbers = [2, 7, 11, 15], target = 9
輸出: [1,2]
解釋: 2 與 7 之和等於目標數 9 。因此 index1 = 1, index2 = 2 。
class Solution {
public int[] twoSum(int[] numbers, int target) {
int len=numbers.length;
int i=0;
int j=len-1;
int []ans=new int[2];
Arrays.sort(numbers);
while(i<j){
if(numbers[i]+numbers[j]==target){
ans[0]=i+1;
ans[1]=j+1;
break;
}
else if(numbers[i]+numbers[j]>target){
j--;
}
else{
i++;
}
}
return ans;
}
}
3.
給定一個包含 n 個整數的數組 nums
,判斷 nums
中是否存在三個元素 a,b,c ,使得 a + b + c = 0 ?找出所有滿足條件且不重複的三元組。
注意:答案中不可以包含重複的三元組。
例如, 給定數組 nums = [-1, 0, 1, 2, -1, -4],
滿足要求的三元組集合爲:
[
[-1, 0, 1],
[-1, -1, 2]
]
//將nums[l]+nums[r]+nums[i]=0
//轉化爲 nums[l]+nums[r]=-nums[i] 即轉化爲2數求和問題
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
Arrays.sort(nums);
List<List<Integer>>ls=new ArrayList<>();
for(int i=0;i<nums.length-2;i++){
if(i==0||(i>0&&nums[i]!=nums[i-1])){
int l=i+1,r=nums.length-1,sum=0-nums[i];
while(l<r){
if(nums[l]+nums[r]==sum){
ls.add(Arrays.asList(nums[i],nums[l],nums[r]));
while(l<r&&nums[l]==nums[l+1])l++;
while(l<r&&nums[r]==nums[r-1])r--;
l++;
r--;
}
else if(nums[l]+nums[r]<sum){
l++;
}
else{
r--;
}
}
}
}
return ls;
}
}
4.最接近的三數之和
給定一個包括 n 個整數的數組 nums
和 一個目標值 target
。找出 nums
中的三個整數,使得它們的和與 target
最接近。返回這三個數的和。假定每組輸入只存在唯一答案。
例如,給定數組 nums = [-1,2,1,-4], 和 target = 1.
與 target 最接近的三個數的和爲 2. (-1 + 2 + 1 = 2).
class Solution {
public int threeSumClosest(int[] nums, int target) {
Arrays.sort(nums);
int len=nums.length;
int i;
int ans=nums[0]+nums[1]+nums[2];
for(i=0;i<len-2;i++){
int l=i+1;
int r=len-1;
while(l<r){
int sum=nums[l]+nums[r]+nums[i];
if(Math.abs(sum-target)<Math.abs(ans-target)){
ans=sum;
}
if(sum>target)
r--;
else if(sum<target)
l++;
else
return target;
}
}
return ans;
}
}