##菜鸟刷题(6)【x 的平方根&寻找比目标字母大的最小字母】
算法思想:二分查找,每次都能将查找区间减半,时间复杂度O(logN)
力扣 69. x 的平方根
实现 int sqrt(int x) 函数。
计算并返回 x 的平方根,其中 x 是非负整数。
由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
示例 1:
输入: 4
输出: 2
示例 2:
输入: 8
输出: 2
说明: 8 的平方根是 2.82842...,
由于返回类型是整数,小数部分将被舍去。
代码:
class Solution {
public int mySqrt(int x) {
if(x<=1) return x;
int l=1,r=x;
while(l<=r){
int m=l+(r-l)/2;
if(m==x/m){
return m;
}else if(m<x/m){
l=m+1;
}else {
r=m-1;
}
}
return r;
}
}
说明:
为了防止加法溢出,m=(l+r)/2写成,m=l+(r-l)/2
为了防止乘法溢出,m*m==x写成m==x/m
给你一个排序后的字符列表 letters
,列表中只包含小写英文字母。另给出一个目标字母 target
,请你寻找在这一有序列表里比目标字母大的最小字母。
在比较时,字母是依序循环出现的。举个例子:
- 如果目标字母
target = 'z'
并且字符列表为letters = ['a', 'b']
,则答案返回'a'
示例:
输入: letters = ["c", "f", "j"] target = "a" 输出: "c" 输入: letters = ["c", "f", "j"] target = "c" 输出: "f" 输入: letters = ["c", "f", "j"] target = "d" 输出: "f" 输入: letters = ["c", "f", "j"] target = "g" 输出: "j" 输入: letters = ["c", "f", "j"] target = "j" 输出: "c" 输入: letters = ["c", "f", "j"] target = "k" 输出: "c"
代码:
class Solution {
public char nextGreatestLetter(char[] letters, char target) {
int l=0;
int r=letters.length-1;
while(l<=r){
int m=l+(r-l)/2;
if(letters[m]<=target){
l=m+1;
}else {
r=m-1;
}
}
if(l==letters.length)return letters[0];
else return letters[l];
}
}
注意最后返回时要对l值判断,如果l等于数组长度了,就说明数组中没有一个字母比目标字母大,就返回数组第一个字符
tips:
二分查找算法的循环条件,左右指针什么时候变如何变,都是关键,说实话今天感觉有点晕,理解不深刻,明天再练习几道二分查找的题