3Sum
我觉得做算法题,一般在不能一下子给出最终的解得时候,应该循序渐进的结局问题,先给出一个近似正确的答案,并进行不断地修正,一步一步的逼近最终得答案,就向这道题一样,可以先实现有重复解得程序,再在这个程序的基础上实现无重复的解。
package leetcode;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class leet15 {
//算法实现将:因为需要三个数相加,所以需先固定前两个数,对第三个数进行循环,然后分别对前两个数的下标进行加1操作,如果
//如果执行加一操作以后的第一个数和前一轮循环的第一个数相等,则此次循环结束,即就是如果有两个相邻的数相等就减少一次循环。
public static List<List<Integer>> threeSum(int[] nums){
List<List<Integer>> result = new ArrayList<List<Integer>>();//存储最终的返回结果
for(int i = 0;i < nums.length - 2;i++){//固定前两个数
List<Integer> inter =new ArrayList<Integer>();//保存每一个相加为0的三个数,即就是最终结果的内部元素
for(int j = 0;j < nums.length;j++){//循环第三个数
if(i > 0){//第一次循环时i=0所以没有i-1,只能是在i>0的时候才能判断
if(nums[i] == nums[i-1])//如果执行加一操作以后的第一个数和前一轮循环的第一个数相等,则此次循环结束,
//即就是如果有两个相邻的数相等就减少一次循环
continue;
}
if(j == i-1||j == i||j==i+1)//相加的三个数下标不能相同
continue;
if(nums[i] + nums[i+1] + nums[j] == 0)
{
inter.add(nums[i]);
inter.add(nums[i+1]);
inter.add(nums[j]);
result.add(inter);
}
}
}
return result;
}
public static int[] bubbleSort(int[] array){//冒泡排序将原数组进行从小到大的排序
for(int i = 0;i < array.length;i++){
for(int j = 1;j < array.length - i;j++){
if(array[j] < array[j-1]){
int temp = array[j-1];
array[j-1] = array[j];
array[j] = temp;
}
}
}
return array;
}
public static void main(String[] args) {//主函数
int[] array = {-1,0,1,2,-1,-4};
array = bubbleSort(array);
List<List<Integer>> list = leet15.threeSum(array);
Iterator<List<Integer>> iter = list.iterator();
while(iter.hasNext()){
System.out.println(iter.next());
}
}
}