跟着LeetCode的Study Plan重温一遍各种经典算法,本期是二分搜索算法Level1 Day3。
题目构成:Easy*2
。
确定一个数是否是完全平方数,用二分搜索查找,代码(C++)如下:
class Solution {
public:
bool isPerfectSquare(int num) {
if (num==1)
return true;
int r{ 0 };
int l{ num };
long long int m{ num/2 };
while (r <= l){
long long int res = m * m;
if (res == num)
return true;
if (res > num)
l = m - 1;
else
r = m + 1;
m = (r+l)/2;
}
return false;
}
};
对于arr1
中的任意一个数,它与arr2
中的每一个数的差的绝对值要大于目标值,统计arr1
中满足条件的元素个数,代码(Golang)如下:
func abs1385(num int) int {
if num >= 0 {
return num
}
return -num
}
func findTheDistanceValue(arr1 []int, arr2 []int, d int) int {
sort.Ints(arr2)
le2 := len(arr2)
helper := func(_num int) bool {
i, j := 0, le2-1
if arr2[0] >= _num {
return arr2[0]-_num > d
}
if arr2[j] <= _num {
return _num - arr2[j] > d
}
for i <= j {
k := (i + j) / 2
v := arr2[k]
if v == _num {
return false
}
if v < _num {
i = k + 1
} else {
j = k - 1
}
}
return abs1385(arr2[i]-_num) > d && abs1385(arr2[i-1]-_num) > d
}
r := 0
for _, a := range arr1 {
if helper(a) {
r++
}
}
return r
}
这道题先把arr2
排序,然后利用35. Search Insert Position的思路,判断arr1
中的每一个数应该插入在arr2
的哪个位置,然后只对比这个位置前后的两个数与插入的数的差就可以了。