从leetcode学到更多

  1. 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)
这样才正确

还是经验不是很足,
多多弥补

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值