代码随想录 Day12
今日任务
35.搜索插入位置
34.在排序数组中查找元素的第一个和最后一个位置
69.x的平方根
367.有效的完全平方数
35. 搜索插入位置
链接:https://leetcode.cn/problems/search-insert-position/
class Solution {
public int searchInsert(int[] nums, int target) {
int left = 0;
int right = nums.length; //左闭右开
while(left < right){
int mid = left + ((right - left) >> 1);
if(nums[mid] == target){
return mid;
}
else if(nums[mid] > target){
right = mid;
}
else if(nums[mid] < target){
left = mid + 1;
}
}
return left; //right也可
}
}
34. 在排序数组中查找元素的第一个和最后一个位置
链接:https://leetcode.cn/problems/find-first-and-last-position-of-element-in-sorted-array/
注意事项:注意终止循环条件,否则很容易陷入死循环
class Solution {
public int[] searchRange(int[] nums, int target) {
int[] result = new int[2];
result[0] = -1;
result[1] = -1;
//nums没有元素,一定返回[-1,-1]
if(nums.length == 0){
return result;
}
int left = 0;
int right = nums.length - 1; //左闭右闭
//得到最左边界
while(left < right){
int mid = left + ((right - left) >> 1);
if(nums[mid] >= target){
right = mid;
}
else if(nums[mid] < target){
left = mid + 1;
}
}
if(nums[left] == target){
result[0] = left; //right也可
}
//nums中不存在目标值
else if(nums[left] != target){
return result;
}
//left = 0; //直接从左边界开始找右边界
right = nums.length - 1;
//得到最右边界
while(left < right){
int mid = left + ((right - left + 1) >> 1); //mid向右侧取
if(nums[mid] <= target){
left = mid;
}
else if(nums[mid] > target){
right = mid - 1;
}
}
// if(nums[right] == target){
// result[1] = right; //left也可
// }
result[1] = right; //此时一定是有右边界的,不用再判断
return result;
}
}
69. x的平方根
链接:https://leetcode.cn/problems/sqrtx/
注意事项:数据溢出
class Solution {
public int mySqrt(int x) {
//int的话相乘会有数据溢出问题
long left = 0;
long right = x; //左闭右闭
while(left < right){
long mid = left + ((right - left + 1) >> 1);
if(mid * mid > x){
right = mid - 1;
}
else if(mid * mid < x){
left = mid;
}
else if(mid * mid == x){
return (int)mid;
}
}
return (int)left;
}
}
367. 有效的完全平方数
链接:https://leetcode.cn/problems/valid-perfect-square/
和上一题一模一样的思路,修改下 return 就可以
class Solution {
public boolean isPerfectSquare(int x){
long left = 0;
long right = x;
while(left < right){
long mid = left + ((right - left + 1) >> 1);
if(mid * mid == x){
return true;
}
else if(mid * mid < x){
left = mid;
}
else if(mid * mid > x){
right = mid - 1;
}
}
return false;
}
}