提交 303f5c92 编写于 作者: 檀越@新空间's avatar 檀越@新空间 🐭

fix:二分查找

上级 82a6d75d
"""
二分查找基础版
"""
from typing import List
class Solution:
def distributeCoins(self, nums: List[int], target: int) -> int:
"""
二分查找基础版
:param nums:
:param target:
:return:
"""
left, right = 0, len(nums) - 1
while left <= right:
mid = (left + right) >> 1
if nums[mid] > target:
right = mid - 1
elif nums[mid] < target:
left = mid + 1
else:
return mid
return -1
if __name__ == '__main__':
result = Solution().distributeCoins([2, 7, 11, 15], 0)
print(result)
"""
二分查找改变版
"""
from typing import List
class Solution:
def distributeCoins(self, nums: List[int], target: int) -> int:
"""
二分查找改变版,如果增大了右边界,那最后的结果肯定不能取到right
:param nums:
:param target:
:return:
"""
left, right = 0, len(nums)
while left < right:
mid = (left + right) >> 1
if nums[mid] > target:
right = mid
elif nums[mid] < target:
left = mid + 1
else:
return mid
return -1
if __name__ == '__main__':
result = Solution().distributeCoins([2, 7, 11, 15], 11)
print(result)
"""
二分查找平衡版
"""
from typing import List
class Solution:
def distributeCoins(self, nums: List[int], target: int) -> int:
"""
二分查找平衡版
:param nums:
:param target:
:return:
"""
left, right = 0, len(nums)
while 1 < right - left:
mid = (left + right) >> 1
if nums[mid] > target:
right = mid
else:
left = mid
return left if target == nums[left] else -1
if __name__ == '__main__':
result = Solution().distributeCoins([2, 7, 11, 15], 6)
print(result)
"""
二分查找java版
"""
from typing import List
class Solution:
def distributeCoins(self, nums: List[int], target: int) -> int:
"""
二分查找java版,返回插入位置加1取反,加1的目的是区别0的位置
:param nums:
:param target:
:return:
"""
left, right = 0, len(nums) - 1
while left <= right:
mid = (left + right) >> 1
if nums[mid] > target:
right = mid - 1
elif nums[mid] < target:
left = mid + 1
else:
return mid
return -left - 1
if __name__ == '__main__':
result = Solution().distributeCoins([2, 7, 11, 15], 1)
print(result)
"""
二分查找Leftmost
"""
from typing import List
class Solution:
def distributeCoins(self, nums: List[int], target: int) -> int:
"""
二分查找Leftmost,最左侧的重复元素
:param nums:
:param target:
:return:
"""
left, right = 0, len(nums) - 1
candidate = -1
while left <= right:
mid = (left + right) >> 1
if nums[mid] > target:
right = mid - 1
elif nums[mid] < target:
left = mid + 1
else:
# 找到后把值给候选人,右指针继续递减
candidate = mid
right = mid - 1
return candidate
if __name__ == '__main__':
result = Solution().distributeCoins([1, 2, 4, 4, 5, 6, 7], 4)
# result = Solution().distributeCoins([1, 2, 4, 4, 4, 5, 6, 7], 4)
print(result)
"""
二分查找Rightmost
"""
from typing import List
class Solution:
def distributeCoins(self, nums: List[int], target: int) -> int:
"""
二分查找Rightmost,最右侧的重复元素
:param nums:
:param target:
:return:
"""
left, right = 0, len(nums) - 1
candidate = -1
while left <= right:
mid = (left + right) >> 1
if nums[mid] > target:
right = mid - 1
elif nums[mid] < target:
left = mid + 1
else:
# 找到后把值给候选人,右指针继续递减
candidate = mid
left = mid + 1
return candidate
if __name__ == '__main__':
# result = Solution().distributeCoins([1, 2, 4, 4, 5, 6, 7], 4)
result = Solution().distributeCoins([1, 2, 4, 4, 4, 5, 6, 7], 4)
print(result)
"""
二分查找Leftmost
"""
from typing import List
class Solution:
def distributeCoins(self, nums: List[int], target: int) -> int:
"""
二分查找Leftmost,小于等于左侧的的位置
:param nums:
:param target:
:return:
"""
left, right = 0, len(nums) - 1
while left <= right:
mid = (left + right) >> 1
if nums[mid] >= target:
# 相等了不想返回,继续压缩右指针
right = mid - 1
else:
left = mid + 1
return left
if __name__ == '__main__':
# result = Solution().distributeCoins([1, 2, 4, 4, 5, 6, 7], 4)
result = Solution().distributeCoins([1, 2, 4, 4, 4, 5, 6, 7], 3)
print(result)
"""
二分查找Rightmost
"""
from typing import List
class Solution:
def distributeCoins(self, nums: List[int], target: int) -> int:
"""
二分查找Rightmost,大于最右侧的重复元素
:param nums:
:param target:
:return:
"""
left, right = 0, len(nums) - 1
while left <= right:
mid = (left + right) >> 1
if nums[mid] > target:
right = mid - 1
else:
# 最后等于最后一个目标值的时候,又加了一次,所以在结果的时候需要减1
left = mid + 1
return left - 1
if __name__ == '__main__':
# result = Solution().distributeCoins([1, 2, 4, 4, 5, 6, 7], 4)
result = Solution().distributeCoins([1, 2, 4, 4, 4, 6, 7], 5)
print(result)
"""
二分查找Rightmost,插入元素在最右边
"""
from typing import List
class Solution:
def distributeCoins(self, nums: List[int], target: int) -> int:
"""
二分查找Rightmost,插入元素在最右边,返回的是插入的index,如果是排名需要再加1
:param nums:
:param target:
:return:
"""
left, right = 0, len(nums) - 1
while left <= right:
mid = (left + right) >> 1
if nums[mid] > target:
right = mid - 1
else:
# 最后等于最后一个目标值的时候,又加了一次,所以在结果的时候需要减1
left = mid + 1
return left
if __name__ == '__main__':
# result = Solution().distributeCoins([1, 2, 4, 4, 5, 6, 7], 4)
result = Solution().distributeCoins([1, 2, 4, 4, 4, 6, 7], 5)
print(result)
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册