文章目录
查找第二次任务打卡
leetcode1. 两数之和
题目描述:
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
程序代码(Java版暴力解法)
class Solution {
public static int[] twoSum(int[] nums, int target) {
int [] res = new int[2];
if(nums.length == 0) return res;
for(int i=0; i<nums.length; i++) {
for(int j=i+1; j<nums.length; j++) {
if(nums[i] == target - nums[j]) {
res[0] = i;
res[1] = j;
}
}
}
return res;
}
}
程序代码(Java版 排序+双指针)
class Solution {
public static int[] twoSum(int[] nums, int target) {
int[] copy = nums.clone();
Arrays.sort(nums);
int [] res = new int[2];
boolean sameFlag = true;
int l = 0;
int r = nums.length-1;
while(l < r) {
if(nums[l] + nums[r] == target) {
break;
}else if(nums[l] + nums[r] < target) {
l++;
}else {
r--;
}
}
for(int i=0; i<nums.length; i++) {
if(copy[i] == nums[l] && sameFlag) {
res[0] = i;
sameFlag = false;
}else if(copy[i] == nums[r]) {
res[1] = i;
}
}
return res;
}
}
leetcode15. 三数之和
题目描述:
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例:
给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]
程序代码(Java版)
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> res = new ArrayList<List<Integer>>();
if(nums.length < 3) return res;
Arrays.sort(nums);
for(int i=0; i<nums.length-3; i++) {
if(nums[i] > 0) break;
if(i>0 && nums[i] == nums[i-1]) continue;
int l = i + 1;
int r = nums.length - 1;
while(l < r) {
int sum = nums[i] + nums[l] + nums[r];
if(sum == 0) {
List<Integer> list = new ArrayList<Integer>();
list.add(nums[i]);
list.add(nums[l]);
list.add(nums[r]);
res.add(list);
while(l<r && nums[l] == nums[l+1]) l++;
while(l<r && nums[r] == nums[r-1]) r--;
l++;
r--;
}else if(sum<0) {
l++;
}else {
r--;
}
}
}
return res;
}
}
leetcode16. 最接近的三数之和
题目描述:
给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
示例:
输入:nums = [-1,2,1,-4], target = 1
输出:2
解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。
提示:
3 <= nums.length <= 10^3
-10^3 <= nums[i] <= 10^3
-10^4 <= target <= 10^4
程序代码(Java版)
class Solution {
public static int threeSumClosest(int[] nums, int target) {
Arrays.sort(nums);
int res = nums[0] + nums[1] + nums[2];
int diff = Math.abs(nums[0] + nums[1] + nums[2] - target);
for(int i=0; i<nums.length; i++) {
int l = i + 1;
int r = nums.length - 1;
while(l < r) {
int t = target - nums[i];
if(nums[l] + nums[r] == t) {
return nums[i] + t;//
}else {
if(Math.abs(nums[l] + nums[r] - t) < diff) {
diff = Math.abs(nums[l] + nums[r] - t);
res = nums[l] + nums[r] + nums[i];
}
if (nums[l]+nums[r] < t) {
l++;
}else {
r--;
}
}
}
}
return res;
}
}
leetcode454. 四数相加 II
题目描述:
给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ,使得 A[i] + B[j] + C[k] + D[l] = 0。
为了使问题简单化,所有的 A, B, C, D 具有相同的长度 N,且 0 ≤ N ≤ 500 。所有整数的范围在 -228 到 228 - 1 之间,最终结果不会超过 231 - 1 。
示例:
输入:
A = [ 1, 2]
B = [-2,-1]
C = [-1, 2]
D = [ 0, 2]
输出:
2
解释:
两个元组如下:
1. (0, 0, 0, 1) -> A[0] + B[0] + C[0] + D[1] = 1 + (-2) + (-1) + 2 = 0
2. (1, 1, 0, 0) -> A[1] + B[1] + C[0] + D[0] = 2 + (-1) + (-1) + 0 = 0
程序代码(Java版)
import java.util.HashMap;
class Solution {
public static int fourSumCount(int[] A, int[] B, int[] C, int[] D) {
HashMap<Integer, Integer> count = new HashMap<Integer, Integer>();
for(int i=0; i<A.length; i++) {
for(int j=0; j<B.length; j++) {
int t = A[i] + B[j];
if(count.containsKey(t)) {
count.put(t, count.get(t)+1);
}else {
count.put(t, 1);
}
}
}
int res = 0;
for(int i=0; i<C.length; i++) {
for(int j=0; j<D.length; j++) {
int t = 0 - C[i] - D[j];
if(count.containsKey(t)) {
res += count.get(t);
}
}
}
return res;
}
}
leetcode219. 存在重复元素 II
题目描述:
给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的 绝对值 至多为 k。
示例 1:
输入: nums = [1,2,3,1], k = 3
输出: true
示例 2:
输入: nums = [1,0,1,1], k = 1
输出: true
示例 3:
输入: nums = [1,2,3,1,2,3], k = 2
输出: false
程序代码(Java版 暴力解法)
class Solution {
public boolean containsNearbyDuplicate(int[] nums, int k) {
for(int i=0; i<nums.length; i++) {
for(int j=i+1; j<nums.length; j++) {
if(nums[i] == nums[j] && Math.abs(i - j) <= k) {
return true;
}
}
}
return false;
}
}
程序代码(Java版 滑动数组)
import java.util.HashSet;
class Solution {
public boolean containsNearbyDuplicate(int[] nums, int k) {
HashSet<Integer> set = new HashSet<Integer>();
for(int i=0; i<nums.length; i++) {
if(set.contains(nums[i])) {
return true;
}
set.add(nums[i]);
if(set.size() == k + 1) {
set.remove(nums[i-k]);
}
}
return false;
}
}