LeetCode刷题——查找2打卡

查找第二次任务打卡

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;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值