4sum代码
class Solution { public List<List<Integer>> fourSum(int[] num, int target) { ArrayList<List<Integer>> ans = new ArrayList<>(); if(num.length<4)return ans; Arrays.sort(num); for(int i=0; i<num.length-3; i++){ if(num[i]+num[i+1]+num[i+2]+num[i+3]>target)break; //first candidate too large, search finished if(num[i]+num[num.length-1]+num[num.length-2]+num[num.length-3]<target)continue; //first candidate too small if(i>0&&num[i]==num[i-1])continue; //prevents duplicate result in ans list for(int j=i+1; j<num.length-2; j++){ if(num[i]+num[j]+num[j+1]+num[j+2]>target)break; //second candidate too large if(num[i]+num[j]+num[num.length-1]+num[num.length-2]<target)continue; //second candidate too small if(j>i+1&&num[j]==num[j-1])continue; //prevents duplicate results in ans list int low=j+1, high=num.length-1; while(low<high){ int sum=num[i]+num[j]+num[low]+num[high]; if(sum==target){ ans.add(Arrays.asList(num[i], num[j], num[low], num[high])); while(low<high&&num[low]==num[low+1])low++; //skipping over duplicate on low while(low<high&&num[high]==num[high-1])high--; //skipping over duplicate on high low++; high--; } //move window else if(sum<target)low++; else high--; } } } return ans; }
从最外层一直到次外层,都有break和continue操作,每次循环开始的时候,可以从极端开始判断是否继续操作,对于如此大时间复杂度的算法,可以节省不少时间。
2sum算法作为这个算法的一处对时间复杂度做指数级优化的算法,因为之前做过排序的操作,所以可以从双尾开始计算,导致时间复杂度从o(n^2) 锐减到 o(n). 令人不禁联想到fastsort的实现方法。
总时间复杂度为o(n^3)。另外有一种以空间换时间的说法,即是将2sum所有可能的值存在map中,然后2者相加。但是需要进行一些判重的判定,较为麻烦。时间复杂度为o(n^2).或许需要重复操作类似数据的时候较为可行~~~
2.Merge k Sorted Lists
开始一看不就是归并?分治 hard?不存在的
觉得很简单嘛,归并排序我写过不少次了
结果遇到一堆坑!!!!!
首先他采用的是ListNode形式的,也就是链表
传参为ListNode[] lists
我使用Arrays.asList(lists)
存储类型为List
我用了一个ArrayList 来存取要删除索引,
然后删除不了。。。。是的,这里并不会自动拆箱为int,把Integer当作一个object了
可以采取两个方法:
直接取Integer.intValue
存储类型为ArrayList //只能放对象,
总算改过来了,然后????
然后不能删除,直接报错UnsupportedOperationException
Arrays.asList 生成的List为浅拷贝数组的
而且只能修改对象的属性,甚至是更换对象,但是怎么都不能增删对象
更改。。。。
再然后我发现删除的时候,报错,删除的超过界限
是因为我删除的索引并没有一定的顺序,删除之后索引发生了改变
把索引列表进行sort然后reverse
这样可以解决
对于之前的某个操作也存在这样的问题,
谨记遍历的时候,对于数组索引和长度等操作,一定要谨慎
对于原始的链表,一定要谨慎操作!
想写个复杂的,我处理size = size/2 +size%2
size = 8
我写的 size= size>>2 + size&1
然后错了。。。我确实真的是忘了 +的优先级大于>> 大于&
结果当然是悲惨的0 size = (size>>2) + (size&1)
这样才正确
还是经验不是很足,
多多弥补