//三数和为0的问题。要求去重,并且输出数字有序。
public List<List<Integer>> threeSum(int[] nums)
{
Arrays.sort(nums);
List<List<Integer>> lists = new ArrayList<List<Integer>>();
//对于i去重,因为p在i后面,所以不能往后去重,可能会把p的值去掉,所以要往前去重。
for(int i = 0; i < nums.length; i ++)
{
if(i>0&&nums[i] == nums[i-1])
{
continue;
}
int p = i+1, q = nums.length - 1;
while(p < q)
{
int sum = nums[i]+nums[p]+nums[q];
if(sum == 0)
{
List<Integer> list = new ArrayList<>();
list.add(nums[i]);
list.add(nums[p]);
list.add(nums[q]);
lists.add(list);
//p去重很巧妙,先自加,然后判断之前p的值和自加后的值是不是相等,如果相等,再次自加,同时也避免的去重时和q重叠。
while(++p < q && nums[p] == nums[p-1])
{
}
while(--q > p && nums[q] == nums[q+1])
{
}
}
if(sum < 0)
{
p++;
}
if(sum > 0)
{
q--;
}
}
}
return lists;
}
//三数和最接近某个值
public int threeSumClosest(int[] nums, int target) {
Arrays.sort(nums);
int temp = 0;
int dist = Integer.MAX_VALUE;
for(int i = 0; i < nums.length; i ++)
{
if(i > 0 && nums[i]==nums[i-1])
{
continue;
}
int p = i + 1, q = nums.length-1;
while(p < q)
{
int sum = nums[i] + nums[p] + nums[q];
if(sum > target)
{
if((sum - target) < dist)
{
dist = sum - target;
temp = sum;
}
q--;
}
else if(sum < target)
{
if((target - sum) < dist)
{
dist = target - sum;
temp = sum;
}
p++;
}
else
{
return sum;
}
}
}
return temp;
}

四数和问题,感觉并不是最优解。

public class Solution {
public List<List<Integer>> fourSum(int[] num, int target) {
Arrays.sort(num);
Set<List<Integer>> hashSet = new HashSet<>();
List<List<Integer>> result = new ArrayList<>(); for (int i = 0; i < num.length; i++) {
for (int j = i + 1; j < num.length; j++) {
int k = j + 1;
int l = num.length - 1; while (k < l) {
int sum = num[i] + num[j] + num[k] + num[l]; if (sum > target) {
l--;
} else if (sum < target) {
k++;
} else if (sum == target) {
ArrayList<Integer> temp = new ArrayList<Integer>();
temp.add(num[i]);
temp.add(num[j]);
temp.add(num[k]);
temp.add(num[l]); if (!hashSet.contains(temp)) {
hashSet.add(temp);
result.add(temp);
} k++;
l--;
}
}
}
} return result;
}
}

最新文章

  1. ASP.NET MVC实现权限控制
  2. T检验与F检验的区别_f检验和t检验的关系
  3. SpringMVC的Controller方法的参数不能直接绑定List、Set、Map
  4. 详解Android功耗分析工具Power Tutor的使用
  5. 搭建angular前端框架 命令
  6. TableView刷新指定的cell 或section
  7. 手机 无法转移到SD卡 Andriod 导出应用程序
  8. Java基础——clone()方法浅析
  9. DP方程及意义
  10. puppet学习:文件夹权限的问题
  11. Supervisord管理
  12. EditPlus3.3 集成 SVN
  13. ES6 JavaScript Promise的感性认知
  14. Grunt的配置和使用(一)
  15. Following unknown configure options were used:--enable-fpm
  16. 《java入门第一季》之Socket编程通信和TCP协议通信图解
  17. shell案例题
  18. 游戏框架设计中的。绑定binding。。。命令 command 和消息message 以及MVVM
  19. MAMP PRO 下安装 memcache
  20. [译]理解Windows消息循环

热门文章

  1. [Spring Data Repositories]学习笔记--使用现有的repository
  2. 【BZOJ1977】[BeiJing2010组队]次小生成树 Tree 最小生成树+倍增
  3. windows下在Eclipse中启动的tomcat没有乱码,单独部署到tomcat下乱码解决方案
  4. Git使fork项目与源项目保持一致方法
  5. Server Objects Extension(SOE)开发(二)
  6. 我的Android进阶之旅------>百度地图学习:BDLocation.getLocType ( )值分析
  7. 单例 与 static
  8. 003-ARP地址解析协议
  9. java switch case 枚举类型的反编译结果
  10. Activity的生命周期整理