leetcode第57题

简介: 和上一道可以说是一个问题,只不过这个是给一个已经合并好的列表,然后给一个新的节点依据规则加入到合并好的列表。解法一对应 56 题的解法一,没看的话,可以先过去看一下。这个问题其实就是我们解法中的一个子问题没看的话,可以先过去看一下。这个问题其实就是我们解法中的一个子问题,所以直接加过来就行了

image.png

上一道可以说是一个问题,只不过这个是给一个已经合并好的列表,然后给一个新的节点依据规则加入到合并好的列表。

解法一

对应 56 题的解法一,没看的话,可以先过去看一下。这个问题其实就是我们解法中的一个子问题没看的话,可以先过去看一下。这个问题其实就是我们解法中的一个子问题,

所以直接加过来就行了

publicList<Interval>insert(List<Interval>intervals, IntervalnewInterval) { 
Intervalstart=null;
Intervalend=null;
inti_start=newInterval.start;
inti_end=newInterval.end;
intsize=intervals.size();
List<Interval>in=newArrayList<>(); 
//遍历合并好的列表for (intj=0; j<size; j++) {
if (i_start>=intervals.get(j).start&&i_start<=intervals.get(j).end) {
start=intervals.get(j);
                }
if (i_end>=intervals.get(j).start&&i_end<=intervals.get(j).end) {
end=intervals.get(j);
                }
if (i_start<intervals.get(j).start&&i_end>intervals.get(j).end) {
in.add(intervals.get(j));
                } 
            }
if (in.size() !=0) { 
for (intindex=0; index<in.size(); index++) {
intervals.remove(in.get(index));
                } 
            }
Intervalinterval=null;
//根据不同的情况,生成新的节点if (equals(start, end)) {
ints=start==null?i_start : start.start;
inte=end==null?i_end : end.end;
interval=newInterval(s, e); 
            } elseif (start!=null&&end!=null) {
interval=newInterval(start.start, end.end); 
            }elseif (start==null) {
interval=newInterval(i_start, i_end); 
            }
if (start!=null) {
intervals.remove(start);
            }
if (end!=null) {
intervals.remove(end);
            }
//不同之处是生成的节点,要遍历原节点,根据 start 插入到对应的位置,虽然题目没说,但这里如果不按顺序插入的话,leetcode 过不了。for(inti=0;i<intervals.size();i++){
if(intervals.get(i).start>interval.start){
intervals.add(i,interval);
returnintervals;
                }
            }
intervals.add(interval);
returnintervals;
        }
privatebooleanequals(Intervalstart, Intervalend) { 
if (start==null&&end==null) {
returnfalse;
    }
if (start==null||end==null) {
returntrue;
    }
if (start.start==end.start&&start.end==end.end) {
returntrue;
    }
returnfalse;
}

时间复杂度:O(n)。

空间复杂度: O(n), 里边的 in 变量用来存储囊括的节点时候耗费的。

我们其实可以利用迭代器,一边遍历,一边删除,这样就不需要 in 变量了。

publicList<Interval>insert(List<Interval>intervals, IntervalnewInterval) {
Intervalstart=null;
Intervalend=null;
inti_start=newInterval.start;
inti_end=newInterval.end;  
//利用迭代器遍历for (Iterator<Interval>it=intervals.iterator(); it.hasNext();) {
Intervalinter=it.next();
if (i_start>=inter.start&&i_start<=inter.end) {
start=inter;
            }
if (i_end>=inter.start&&i_end<=inter.end) {
end=inter;
            }
if (i_start<inter.start&&i_end>inter.end) {
it.remove();
            }
        }
Intervalinterval=null;
if (equals(start, end)) {
ints=start==null?i_start : start.start;
inte=end==null?i_end : end.end;
interval=newInterval(s, e);
        } elseif (start!=null&&end!=null) {
interval=newInterval(start.start, end.end);
        } elseif (start==null) {
interval=newInterval(i_start, i_end);
        }
if (start!=null) {
intervals.remove(start);
        }
if (end!=null) {
intervals.remove(end);
        }
for (inti=0; i<intervals.size(); i++) {
if (intervals.get(i).start>interval.start) {
intervals.add(i, interval);
returnintervals;
            }
        }
intervals.add(interval);
returnintervals; 
    }
privatebooleanequals(Intervalstart, Intervalend) { 
if (start==null&&end==null) {
returnfalse;
    }
if (start==null||end==null) {
returntrue;
    }
if (start.start==end.start&&start.end==end.end) {
returntrue;
    }
returnfalse;
}

时间复杂度:O(n)。

空间复杂度: O(1)。

总的来说,这道题可以看做上道题的一些变形,本质上是一样的。由于用 for 循环不能一边遍历列表,一边删除某个元素,所以利用迭代器实现边遍历,边删除,自己也是第一次用。此外,解法一更加通用些,它不要求给定的列表有序。



相关文章
|
7月前
LeetCode
LeetCode
42 0
|
7月前
leetcode-1219:黄金矿工
leetcode-1219:黄金矿工
84 0
单链表反转 LeetCode 206
单链表反转 LeetCode 206
75 0
LeetCode 283. 移动零
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
89 0
|
机器学习/深度学习
leetcode第50题
求幂次方,用最简单的想法,就是写一个 for 循环累乘。 至于求负幂次方,比如 2^{-10}2−10,可以先求出 2^{10}210,然后取倒数,1/2^{10}1/210 ,就可以了 double mul = 1; if (n > 0) { for (int i = 0; i < n; i++) { mul *= x; } } else { n = -n; for (int i = 0; i < n; i++) { mul *= x; } mul = 1 / mul; }
leetcode第50题
|
存储
leetcode第52题
可以发现对于同一条副对角线,row + col 的值是相等的。 对于同一条主对角线,row - col 的值是相等的。 我们同样可以用一个 bool 型数组,来保存当前对角线是否有元素,把它们相加相减的值作为下标。 对于 row - col ,由于出现了负数,所以可以加 1 个 n,由 [ - 3, 3 ] 转换为 [ 1 , 7 ] 。
leetcode第52题
leetcode第34题
从左向右遍历,一旦出现等于 target 的值就结束,保存当前下标。如果从左到右没有找到 target,那么就直接返回 [ -1 , -1 ] 就可以了,因为从左到右没找到,那么从右到左也一定不会找到的。如果找到了,然后再从右到左遍历,一旦出现等于 target 的值就结束,保存当前下标。 时间复杂度是 O(n)并不满足题意,但可以了解下这个思路,从左到右,从右到左之前也遇到过。
leetcode第34题
leetcode第16题
受到上一题的启发,没有看的,推荐大家可以看一下。我们完全可以先将数组排序,然后先固定一个数字,然后利用头尾两个指针进行遍历,降低一个 O(n)的时间复杂度。 如果 sum 大于 target 就减小右指针,反之,就增加左指针。
leetcode第16题
leetcode第26题
for 循环遍历每个数,while 循环判断当前数和它的后一个数是否相等,相等就后移一个数,并且接着判断后移的数和它后边的数是否相等,然后一直循环下去。不相等就将后一个数保存起来,并且长度加 1,然后结束循环。
leetcode第26题
leetcode第21题
总 递归看起来,两个字,优雅!但是关于递归的时间复杂度,空间复杂度的求法,先留个坑吧。
leetcode第21题