threeSum问题

三数之和等于0的问题:

给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。

注意:答案中不可以包含重复的三元组。

例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],

满足要求的三元组集合为:
[
  [-1, 0, 1],
  [-1, -1, 2]
]

 思想:

  由于水平问题,本人目前只能想到用一个一个遍历来找满足条件的元素。

    1.首先我们定义两个集合,一个是List找<Integer>类型集合list。

    2.找到满足元素后,定义一个是Integer类型的集合l,我们需要把满足条件的元素加入集合l里面。

    3.然后我们判断集合list包含的集合l是否包含满足条件的元素,如果满足,说明前面我们已经加入了,可能是顺序不同,但是数字完全相同。这个时候直接移除该集合l然后跳出判断语句。

    4.接下来判断集合list是否包含集合l,不包含就add

    5.最后我们返回list集合,整体思路大概就是这样。

下面我们附上代码

import java.util.ArrayList;
import java.util.List;

public class threeSum {
	 public List<List<Integer>> threeSum(int[] nums) {
		 List<List<Integer>> list = new ArrayList<List<Integer>>();
		 for(int i = 0;i<nums.length-2;i++) {
			 for(int j = i+1;j<nums.length - 1;j++) {
				 for(int k = j+1;k<nums.length;k++) {
					 if(nums[i]+nums[j]+nums[k] == 0) {
						 List<Integer> l = new ArrayList<Integer>();
						 l.add(nums[i]);
						 l.add(nums[j]);
						 l.add(nums[k]);
						 for(int m = 0;m<list.size();m++) {
							 if(list.get(m).contains(nums[i])&&list.get(m).contains(nums[j])&&list.get(m).contains(nums[k])&&(nums[i]!=0||nums[j]!=0||nums[k]!=0)) {
								list.remove(m);
							 	break;
							 }
						 }
						 if(!list.contains(l)) {
							 list.add(l);
						 }
					 }
				 }
			 }
		 }
		 return list;
	 }

  总结:写这段代码遇到最大的问题就是处理三个元素都是0时,条件判断语句没想好,导致写的代码看起来不美观,并且,时间复杂度也挺大的。这个代码后期会优化的。

 

  坚持撸下去,终有一天我们也能站在最高处。      -------送给和我一样的初学者

posted @ 2018-11-28 23:40  码到成功hy  阅读(410)  评论(0编辑  收藏  举报
获取

hahah

name age option