每日一题20220605
作者:互联网
- 给定一个数字n,表示一开始有编号1~n的树木,列成一条直线,
给定一个有序数组arr,表示现在哪些树已经没了,arr[i]一定在[1,n]范围,
给定一个数字m,表示你可以补种多少棵树。
返回补种之后,最长的连续树木,有多少棵。
滑动窗口的思想
public int longestTrees(int n,int m,int[] arr){
System.out.printf("一共有{}棵树,其中有这么{}树是缺失的,给你{}这些树是可以进行补救的",n,arr,m);
int ans =0;
int start =1;
System.out.printf("进行循环操作,循环变量i={},j={},j循环{}次",0,m,arr.length);
for (int i=0,j=m;j<arr.length;i++,j++){
ans = Math.max(ans,arr[j] - start);
start = arr[i]+1;
}
System.out.printf("最后一次也要进行最大值比较");
ans = Math.max(ans,n-start+1);
System.out.printf("得到的结果为{},进行返回",ans);
return ans;
}
- a -> b,代表a在食物链中被b捕食,
给定一个有向无环图,返回这个图中从最初级动物到最顶级捕食者的食物链有几条。
来自理想汽车
- 一开始在0位置,每一次都可以向左或者向右跳,
第i次能向左或者向右跳严格的i步。
请问从0到x位置,至少跳几次可以到达。
来自字节
/**
* 1- 1
* 2- 3 1
* 3- 6 4 2 0
* 4- 10 8 6 4 2 0
* 5- 15 13 11 9 7 5 3 1
* ...
* @param target
* @return
*/
public int reachNumber(long target){
if (target ==0){
return 0;
}
target = Math.abs(target);
long l = 0;
long r = target;
long m = 0;
long near = 0;
while (l<=r){
m = (l+r)/2;
if (sum(m)>=target){
near = m;
r = m-1;
}else {
l = m+1;
}
}
if (sum(near) == target){
return (int) near;
}
if (((sum(near) - target) & 1) ==1){
near++;
}
if (((sum(near) - target) & 1) ==1){
near++;
}
return (int)near;
}
public static long sum(long n){
return (n*(n+1))/2;
}
标签:arr,return,target,int,20220605,每日,long,near,一题 来源: https://www.cnblogs.com/xyf-study/p/16344420.html