数组任意几个元素和
来源:互联网 发布:淘宝兰亭序放大版字帖 编辑:程序博客网 时间:2024/06/05 14:25
(一)2Sum(easy)
https://leetcode.com/problems/two-sum/description/
题目:求数组中,相加得到指定结果的两个数的位置
解答:依次把数组中所有数相加比较 O(n^2)
优化:使用Hashmap, O(nlogn)
第一次犯错:Map map = new HashMap< Integer, Integer>(); 最后少了括号
代码:
public class Solution {
public int[] twoSum(int[] nums, int target) {
int len = nums.length;
int[] res = new int[2];
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (int i = 0; i < len; i++) {
if (map.containsKey(target - nums[i])) {
res[1] = i;
res[0] = map.get(target - nums[i]);
return res;
}
map.put(nums[i], i);
}
return res;
}
}
public int[] twoSum(int[] nums, int target) {
int len = nums.length;
int[] res = new int[2];
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (int i = 0; i < len; i++) {
if (map.containsKey(target - nums[i])) {
res[1] = i;
res[0] = map.get(target - nums[i]);
return res;
}
map.put(nums[i], i);
}
return res;
}
}
(二)3Sum (Median)
https://leetcode.com/problems/3sum/description/
题目:数组数组中所有的三个数的和为0的组合,不可重复;
解答:将数组元素排序,固定一个元素,头尾指针分别指向该元素的下一个元素(次小)和数组尾(最大),依次比较并移动指针,遇到相同元素跳过;
第一次犯错:当找到满足条件组合时,没有lo++,hi++,导致死循环;
第二次犯错:只考虑两指针指向的元素不可重复,忘记考虑固定的元素同样不可重复;
代码:
public class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> res = new LinkedList<>();
Arrays.sort(nums);
for (int i = 0; i < nums.length; i++) {
while (i > 0 && i < nums.length && nums[i] == nums[i-1]) i++;
int lo = i + 1;
int hi = nums.length - 1;
while (lo < hi) {
if (nums[lo] + nums[hi] < 0 - nums[i] ) lo++;
else if (nums[lo] + nums[hi] > 0 - nums[i] ) hi--;
else {
res.add(Arrays.asList(nums[i],nums[lo],nums[hi]));
while (lo < hi && nums[lo] == nums[lo+1]) lo++;
while (lo < hi && nums[hi] == nums[hi - 1]) hi--;
lo++;
hi--;
}
}
}
return res;
}
}
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> res = new LinkedList<>();
Arrays.sort(nums);
for (int i = 0; i < nums.length; i++) {
while (i > 0 && i < nums.length && nums[i] == nums[i-1]) i++;
int lo = i + 1;
int hi = nums.length - 1;
while (lo < hi) {
if (nums[lo] + nums[hi] < 0 - nums[i] ) lo++;
else if (nums[lo] + nums[hi] > 0 - nums[i] ) hi--;
else {
res.add(Arrays.asList(nums[i],nums[lo],nums[hi]));
while (lo < hi && nums[lo] == nums[lo+1]) lo++;
while (lo < hi && nums[hi] == nums[hi - 1]) hi--;
lo++;
hi--;
}
}
}
return res;
}
}
(三)3Sum Closest (Medium)
https://leetcode.com/problems/3sum-closest/description/
题目:找出数组中三个数和最接近目标值的和
解答:现将数组排序。在数组中设三个指针:第一个指针从头开始依次遍历数组;第二个指针指向第一个指针的下一个元素;第三个指针指向数组尾部。若当前3个指针指向的元素值比目标值大,将第二个指针右移;反之,将第三个指针左移。
第一次犯错:忘记第一个指针移动后,其余两指针的值需要初始化;
代码:
public class Solution {
public int threeSumClosest(int[] nums, int target) {
int res = nums[0] + nums[1] + nums[2];
Arrays.sort(nums);
for (int i = 0; i < nums.length - 2; i++) {
int pointer1 = i + 1;
int pointer2 = nums.length - 1;
while (pointer1 < pointer2) {
int temp = nums[i] + nums[pointer1] + nums[pointer2];
if (temp < target) pointer1++;
else if (temp > target) pointer2--;
else return target;
if (Math.abs(target - res) > Math.abs(target - temp)) res = temp;
}
}
return res;
}
}
public int threeSumClosest(int[] nums, int target) {
int res = nums[0] + nums[1] + nums[2];
Arrays.sort(nums);
for (int i = 0; i < nums.length - 2; i++) {
int pointer1 = i + 1;
int pointer2 = nums.length - 1;
while (pointer1 < pointer2) {
int temp = nums[i] + nums[pointer1] + nums[pointer2];
if (temp < target) pointer1++;
else if (temp > target) pointer2--;
else return target;
if (Math.abs(target - res) > Math.abs(target - temp)) res = temp;
}
}
return res;
}
}
阅读全文
0 0
- 数组任意几个元素和
- 数组元素的删除、首元素和尾元素的删除、任意位置元素的删除
- 求数组中任意连续位置元素和的最大值
- Java 旋转数组查找旋转点和任意元素(元素可重复)
- 交换数组的任意2个元素
- java删除数组中的任意位置元素
- js简单删除数组中任意元素
- Java 列举数组中任意元素和为定值的组合
- 求一个数组中的和为任意一个数的两个元素
- 求解数组中任意两个元素的和最接近某一个数
- 数组任意位置插入元素,删除特定元素
- 有两个数组a,b,大小都为n,数组元素的值任意,无序;要求:通过交换a,b中的元素,使数组a元素的和与数组b元素的和之间的差最小
- 有两个数组a,b,大小都为n,数组元素的值任意,无序;要求:通过交换a,b中的元素,使数组a元素的和与数组b元素的和之间的差最小
- 有两个数组a,b,大小都为n,数组元素的值任意,无序; 要求:通过交换a,b中的元素,使数组a元素的和与数组b元素的和之间的差最小。
- 【华为】题目:有两个数组a,b,大小都为n,数组元素的值任意,无序; 要求: 通过交换a,b中的元素,使数组a元素的和与数组b元素的和之间的差最小。
- java中从一个对象数组中删除元素和判断对象数组存了几个元素的方法
- 怎样快速判断一个数组中,和值(任意1个或几个的和) 是否等于某值:
- 数组A中任意两个相邻元素大小相差1,现给定这样的数组A和目标整数t,找出t在数组A中的位置。
- Hive常用语句记录
- bzoj3674 可持久化并查集加强版
- Java多线程-工具篇-BlockingQueue
- 矩阵快速幂
- sql server 2008 使用正则替换的问题
- 数组任意几个元素和
- PDF转Word方法大盘点:看了这一篇,就不用再找转换技巧了
- App server和Web server的区别
- thinkPHP 截取字符串
- Mr. Frog’s Problem C
- python倒排索引
- Codeforces 387E 树状数组
- Mysql读写分离实例
- linux中系统延时及定时任务