【作业2】求 x 平方根的上界
对应课程链接:拿捏算法面试:5. LeetCode69.x的平方根.
在 x 的平方根中,我们求解的是下界,也就是舍弃了小数点部分,这个作业中,我们要求 x 平方根的上界哦,比如当 x = 8 时,x 的平方根大约是 2.8,那我们的答案就是 3,也就是求上界,作业要求:
1、给出秋 x 平方根上限的题解,我这里统一一下方法名,如下
int myUpperSqrt(int x){
}
注意点:
1、当 left = mid 会出现死循环,但是当 right = mid 时并不会出现死循环。
2、mid * mid < x 时,那么 mid 就不可能是我们要找的目标数。
PS:如果你不知道怎么打卡,可以看这里:打卡细则
共以下 38 个回答
class ArrayTest {
int myUpperSqrt(int x) {
int l = 0;
int r = x;
int mid = 0;
while(l <= r){
/修改了一下最后输出条件/
if(r – l <= 1){
return l * l < x ? r : l;
}
mid = l + (r – l) / 2;
if((long)midmid < x){
l = mid+1;
}else if((long)midmid > x){
r = mid;
}else{
return mid;
}
}
return mid;
}
}
“`java
打卡
即寻找第一个大于x或最后一个等于x的元素
以下是代码
下面是代码
“`java
int myUpperSqrt(int x){
int l = 1;
int r = x;
while(l<=r){ if(r - l <= 1){ return l * l >= x ? l : r;
}
int mid = l + (r-l)/2;
if (mid*mid < x){ l = mid + 1; }else if (mid*mid > x){
r = mid;
}else{
return mid;
}
}
return 0;
}
求上限
“`c++
int myUpperSqrt(int x){
//闭区间
int l = 0 ;
int r = x ;
int mid ;
while (l <= r) { if(r - l <= 1) { if (r * r >= x && l * l < x) { return r; } return l ;
}
求上限:
求下线:
提交
int myUpperSqrt(int x){
int l = 0, r = x, ans = -1;
while (l <= r) {
int mid = l + (r – l) / 2;
if ((long) mid * mid < x) {
提交
将之前L、R的思想互换一下。在mid*mid > x时,R反而可能是我们需要求的。
之前刷的时候没看见这个作业,补交
以下是鄙人答案
一
#时间复杂度O(logn)
class Solution:
def myUpperSqrt(self, x: int) ->int:
l = 0
r = x
while l <= r:
if r – l <= 1:
return r if l * l < x else l
mid = l + (r – l) // 2
if mid * mid > x:
r = mid
elif mid * mid x:
return mid
else:
l = mid + 1
return -1
题目只要求取整数,由暴力求解的启发,只要查找到对应的数即可;
时间复杂度O(logn)
public int myUpperSqrt(int x) {
int left = 0;
int right = x;
while (left <= right) {
if(left right){
return left;
}
int mid = left + (right – left) / 2;
if ((long) mid * mid x) {
return mid;
} else if ((long) mid * mid > x) {
right = mid;
}
else {
left = mid + 1;
}
}
return -1;
}
时间复杂度O(logn)
go语言,时间复杂度O(logn)。
使用mid*mid可能会超边界,使用mid>x/mid则要添加x%mid!=0的条件,各有好处吧。
回头再学习一下其他人的解法。
二分查找,l = r是有意义的,所以while是<=,然后还有l = mid + 1,不+1一直循环了
时间复杂度 O(logn)
和 小肸 想法一样,可以将问题转化为:求一个有序数组中(可重复),与 target 相等的最后一个值的下标,如果没有,返回第一个比 target 大的值的下标
作业2打卡
类似于二次查找找得到值就返回数组下标,找不到就返回第一个大于值的元素下标。找上界。
注意long temp = mid * mid时,mid也必须是long类型,因为mid * mid 可能溢出int型,然后溢出的值赋给了long。但(long)(mid * mid)没有限制,或者赋值语句写成long temp = (long) mid * mid;
准备好的一个二分模板,注意long
求上界,那就是第一个平方大于或等于的。
模版有好几个,不要弄错了哦,要自己寻找一种方式来记忆他们勒
我这个测了测应该是没问题的吧?B站灵茶山艾府,有一个模板可以轻微变动解决变形题。
下面是代码
作业二打卡