固定两个,另一个游标。利用hash查找可能快一些。hash查找的思路是:
先遍历一遍查找,把N-ints[i]作为key,value是arraylist,存放下标,直接使用下标作为value不能解决hash冲突,然后双循环,可以利用排序剪枝当ints[i]+ints[j]>N,就可以终止循环了。判断contains(ints[i]+ints[j]),然后看i,j是否在arraylist里面。
这里是排序二分查找+剪枝。
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; public class Main { public static boolean hasSumEqualN(int[] ints, int N){ if(ints.length < 3){return false;} for(int i = 0; i < ints.length; i++){ for(int j = i + 1; j < ints.length; j++){ int l = j + 1, r = ints.length; int temp = N - ints[i] - ints[j]; if(temp > N){ return false; } if(l <= r){ if(Arrays.binarySearch(Arrays.copyOfRange(ints, l, r), temp) > 0){ return true; } } } } return false; } public static void main(String[] args) throws IOException{ BufferedReader buf = new BufferedReader(new InputStreamReader(System.in)); String[] s = buf.readLine().split(","); int[] ints = Arrays.stream(s[0].split(" ")).parallel().mapToInt(Integer::parseInt).toArray(); int N = Integer.parseInt(s[1]); Arrays.sort(ints); if(hasSumEqualN(ints,N)){ System.out.println("True"); }else { System.out.println("False"); } } }