力扣随机题

发布于:2024-10-12 ⋅ 阅读:(10) ⋅ 点赞:(0)

从链表中移除在数组中存在的节点

题目

3217. 从链表中移除在数组中存在的节点 - 力扣(LeetCode)

思路

直接模拟

代码

public ListNode modifiedList(int[] nums, ListNode head) {
        ListNode node = new ListNode();
        node.next = head;
        List<Integer> list = new ArrayList<>();
        for(int a:nums){
            list.add(a);
        }
        ListNode cur = node;
        while(cur.next!=null){
            if(list.contains(cur.val)){
                cur.next=cur.next.next;
            }else{
                cur=cur.next;
            }
        }
        return node.next;
    }

小张刷题日记

题目

LCP 12. 小张刷题计划 - 力扣(LeetCode)

思路

  1. 首先当数组长度小于等于刷题日期长度时,每天都可以使用求助,所以最小时间为0。
  2. 使用二分查找找出最小的刷题日期长度,最大值为数组所以元素之和,最小值为0。
  3. 判断当前maxTime是否能完成刷题,不断更新二分查找的值。

代码

public int minTime(int[] time, int m) {
        if(time.length<=m){
            return 0;
        }
        int l = 0, r = Arrays.stream(time).sum();
        while(l<r){
            int mid = (l+r)/2;
            if(check(time,mid,m)){
                r = mid;
            }else{
                l = mid + 1;
            }
        }
        return l;
    }

    private boolean check(int[] time, int maxTime, int m) {
        int days = 1;//当前天数
        int curr = 0;//当前数组下标
        int sum = 0;//当前日期的刷题时长
        int max = 0;//当前日期的最大刷题时长
        while(curr<time.length){
            sum = sum + time[curr];
            max = Math.max(time[curr],max);
            if(sum - max > maxTime){//判断使用完求助机会是否能完成当前题目
                days++;
                if(days>m){//超出天数
                    return false;
                }
                sum = time[curr];
                max = sum;
            }
            curr++;
        }
        return true;
    }