从链表中移除在数组中存在的节点
题目
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;
}
小张刷题日记
题目
思路
- 首先当数组长度小于等于刷题日期长度时,每天都可以使用求助,所以最小时间为0。
- 使用二分查找找出最小的刷题日期长度,最大值为数组所以元素之和,最小值为0。
- 判断当前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;
}