每日一题
二分查找
leetcode 704 二分查找
https://leetcode.cn/problems/binary-search/
题解:
CPP:
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size() - 1;
while(left < right){
int middle = left + right >> 1;
if(nums[middle] >= target){
right = middle;
}else{
left = middle + 1;
}
}
if(nums[left] == target) return left;
return -1;
}
};
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size() - 1;
while(left < right){
int middle = left + right + 1 >> 1;
if(nums[middle] > target){
right = middle - 1;
}else{
left = middle;
}
}
if(nums[left] == target) return left;
return -1;
}
};
python:
class Solution:
def search(self, nums: List[int], target: int) -> int:
left, right = 0,len(nums) - 1
while left < right:
middle = left + right + 1 >> 1
if nums[middle] > target:
right = middle - 1
elif nums[middle] <= target:
left = middle
if nums[left] == target:
return left
return -1
class Solution:
def search(self, nums: List[int], target: int) -> int:
left, right = 0,len(nums) - 1
while left < right:
middle = left + right >> 1
if nums[middle] >= target:
right = middle
elif nums[middle] < target:
left = middle + 1
if nums[left] == target:
return left
return -1
leetcode 35.搜索插入位置
https://leetcode.cn/problems/search-insert-position/
代码:
cpp:
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int left = 0;
int right = nums.size() - 1;
if(nums[left] > target) return left;
while(left < right){
int middle = left + right + 1 >> 1;
if(nums[middle] > target){
right = middle - 1;
}else{
left = middle;
}
}
if(nums[left] == target) return left;
return left + 1;
}
};
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int left = 0;
int right = nums.size() - 1;
if(nums[right] < target) return right + 1;
while(left < right){
int middle = left + right >> 1;
if(nums[middle] >= target){
right = middle;
}else{
left = middle + 1;
}
}
return left;
}
};
python:
class Solution(object):
def searchInsert(self, nums, target):
left, right = 0, len(nums) - 1
if target > nums[right]:
return right + 1
while left < right:
middle = left + right >> 1
if nums[middle] >= target:
right = middle
else:
left = middle + 1
return left
class Solution(object):
def searchInsert(self, nums, target):
left, right = 0, len(nums) - 1
if target < nums[left]:
return left
while left < right:
middle = left + right + 1 >> 1
if nums[middle] <= target:
left = middle
else:
right = middle - 1
if nums[left] == target:
return left
return left + 1
leetcode 34.在排序数组中查找元素的第一个和最后一个位置
https://leetcode.cn/problems/find-first-and-last-position-of-element-in-sorted-array/
cpp
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
if(nums.size() == 0) return {-1, -1};
int left = 0;
int right = nums.size() - 1;
int leftborder;
int rightborder;
while(left < right){
int middle = (left + right) >> 1;
if(nums[middle] >= target){
right = middle;
}else{
left = middle + 1;
}
}
leftborder = left;
if(nums[leftborder] != target) return {-1, -1};
else
{
left = 0;
right = nums.size() - 1;
while(left < right){
int middle = (left + right + 1) >> 1;
if(nums[middle] > target){
right = middle - 1;
}else{
left = middle;
}
}
rightborder = left;
}
return {leftborder, rightborder};
}
};
python
class Solution:
def searchRange(self, nums: List[int], target: int) -> List[int]:
if len(nums) == 0:
return [-1, -1]
left, right = 0, len(nums) - 1
while left < right:
middle = left + right >> 1
if nums[middle] >= target:
right = middle
else:
left = middle + 1
if nums[left] != target:
return [-1, -1]
else:
leftboarder = left
left = 0
right = len(nums) - 1
while left < right:
middle = left + right + 1 >> 1
if nums[middle] > target:
right = middle - 1
else:
left = middle
rightborder = left
return [leftboarder, rightborder]
leetcode 69.x的平方根
https://leetcode.cn/problems/sqrtx/
cpp
class Solution {
public:
int mySqrt(int x) {
if(x <= 1) return x;
int left = 0;
int right = x / 2 + 1;
while(left < right){
int middle = (left + right) >> 1;
if((long long)middle * middle <= x){//注意需要进行类型转换,防止int类型无法表示乘积
left = middle + 1;
}else{
right = middle;
}
}
return left - 1;
}
};
python
class Solution:
def mySqrt(self, x: int) -> int:
if x <= 1:
return x
left, right = 0, x // 2 + 1
while left < right:
middle = (left + right) // 2
if middle * middle <= x:
left = middle + 1
else:
right = middle
return int(left - 1)
#需要注意python支持高精度,需要使用整除来表示除法
leetcode367. 有效的完全平方根
https://leetcode.cn/problems/valid-perfect-square/
cpp
class Solution {
public:
bool isPerfectSquare(int num) {
long left = 1;
long right = num / 2;
while(left < right){
long middle = (left + right) / 2;
if(middle * middle == num) return true;
if(middle * middle < num){
left = middle + 1;
}else{
right = middle - 1;
}
}
if (left*left == num) return true;
return false;
}
};
python
class Solution:
def isPerfectSquare(self, num: int) -> bool:
left, right = 1, num // 2
while left < right:
middle = (left + right) // 2
if middle * middle == num:
return True
if middle * middle > num:
right = middle - 1
else:
left = middle + 1
if left * left == num:
return True
return False