diff --git "a/999-\347\256\227\346\263\225\346\200\235\346\203\263/01-\344\272\214\345\210\206\346\237\245\346\211\276/problem_solving_01.py" "b/999-\347\256\227\346\263\225\346\200\235\346\203\263/01-\344\272\214\345\210\206\346\237\245\346\211\276/problem_solving_01.py" new file mode 100644 index 0000000000000000000000000000000000000000..e874c03de8c86c21b247ebffa0a8a4c0daf38761 --- /dev/null +++ "b/999-\347\256\227\346\263\225\346\200\235\346\203\263/01-\344\272\214\345\210\206\346\237\245\346\211\276/problem_solving_01.py" @@ -0,0 +1,29 @@ +""" +二分查找基础版 +""" + +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) diff --git "a/999-\347\256\227\346\263\225\346\200\235\346\203\263/01-\344\272\214\345\210\206\346\237\245\346\211\276/problem_solving_02.py" "b/999-\347\256\227\346\263\225\346\200\235\346\203\263/01-\344\272\214\345\210\206\346\237\245\346\211\276/problem_solving_02.py" new file mode 100644 index 0000000000000000000000000000000000000000..806259e38766f1ca2616c23025b4a2945d392af9 --- /dev/null +++ "b/999-\347\256\227\346\263\225\346\200\235\346\203\263/01-\344\272\214\345\210\206\346\237\245\346\211\276/problem_solving_02.py" @@ -0,0 +1,30 @@ +""" +二分查找改变版 +""" + +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) diff --git "a/999-\347\256\227\346\263\225\346\200\235\346\203\263/01-\344\272\214\345\210\206\346\237\245\346\211\276/problem_solving_03.py" "b/999-\347\256\227\346\263\225\346\200\235\346\203\263/01-\344\272\214\345\210\206\346\237\245\346\211\276/problem_solving_03.py" new file mode 100644 index 0000000000000000000000000000000000000000..235d4d8f89eb023c9742f278b15082bd37e55589 --- /dev/null +++ "b/999-\347\256\227\346\263\225\346\200\235\346\203\263/01-\344\272\214\345\210\206\346\237\245\346\211\276/problem_solving_03.py" @@ -0,0 +1,28 @@ +""" +二分查找平衡版 +""" + +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) diff --git "a/999-\347\256\227\346\263\225\346\200\235\346\203\263/01-\344\272\214\345\210\206\346\237\245\346\211\276/problem_solving_04.py" "b/999-\347\256\227\346\263\225\346\200\235\346\203\263/01-\344\272\214\345\210\206\346\237\245\346\211\276/problem_solving_04.py" new file mode 100644 index 0000000000000000000000000000000000000000..b452d927e85d56046efab04ed543fb91fc8389cc --- /dev/null +++ "b/999-\347\256\227\346\263\225\346\200\235\346\203\263/01-\344\272\214\345\210\206\346\237\245\346\211\276/problem_solving_04.py" @@ -0,0 +1,30 @@ +""" +二分查找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) diff --git "a/999-\347\256\227\346\263\225\346\200\235\346\203\263/01-\344\272\214\345\210\206\346\237\245\346\211\276/problem_solving_05.py" "b/999-\347\256\227\346\263\225\346\200\235\346\203\263/01-\344\272\214\345\210\206\346\237\245\346\211\276/problem_solving_05.py" new file mode 100644 index 0000000000000000000000000000000000000000..469336faa1eae0150d7f8c02597fc8cbc1252366 --- /dev/null +++ "b/999-\347\256\227\346\263\225\346\200\235\346\203\263/01-\344\272\214\345\210\206\346\237\245\346\211\276/problem_solving_05.py" @@ -0,0 +1,34 @@ +""" +二分查找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) diff --git "a/999-\347\256\227\346\263\225\346\200\235\346\203\263/01-\344\272\214\345\210\206\346\237\245\346\211\276/problem_solving_06.py" "b/999-\347\256\227\346\263\225\346\200\235\346\203\263/01-\344\272\214\345\210\206\346\237\245\346\211\276/problem_solving_06.py" new file mode 100644 index 0000000000000000000000000000000000000000..4d472519997bca6d1a441f61c2b26c45da13d384 --- /dev/null +++ "b/999-\347\256\227\346\263\225\346\200\235\346\203\263/01-\344\272\214\345\210\206\346\237\245\346\211\276/problem_solving_06.py" @@ -0,0 +1,34 @@ +""" +二分查找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) diff --git "a/999-\347\256\227\346\263\225\346\200\235\346\203\263/01-\344\272\214\345\210\206\346\237\245\346\211\276/problem_solving_07.py" "b/999-\347\256\227\346\263\225\346\200\235\346\203\263/01-\344\272\214\345\210\206\346\237\245\346\211\276/problem_solving_07.py" new file mode 100644 index 0000000000000000000000000000000000000000..a8893d8103d6a0e0219535614a5d34f53198b4b5 --- /dev/null +++ "b/999-\347\256\227\346\263\225\346\200\235\346\203\263/01-\344\272\214\345\210\206\346\237\245\346\211\276/problem_solving_07.py" @@ -0,0 +1,30 @@ +""" +二分查找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) diff --git "a/999-\347\256\227\346\263\225\346\200\235\346\203\263/01-\344\272\214\345\210\206\346\237\245\346\211\276/problem_solving_08.py" "b/999-\347\256\227\346\263\225\346\200\235\346\203\263/01-\344\272\214\345\210\206\346\237\245\346\211\276/problem_solving_08.py" new file mode 100644 index 0000000000000000000000000000000000000000..5838af159d1fedfaec2780989f0d24057beebb53 --- /dev/null +++ "b/999-\347\256\227\346\263\225\346\200\235\346\203\263/01-\344\272\214\345\210\206\346\237\245\346\211\276/problem_solving_08.py" @@ -0,0 +1,30 @@ +""" +二分查找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) diff --git "a/999-\347\256\227\346\263\225\346\200\235\346\203\263/01-\344\272\214\345\210\206\346\237\245\346\211\276/problem_solving_09.py" "b/999-\347\256\227\346\263\225\346\200\235\346\203\263/01-\344\272\214\345\210\206\346\237\245\346\211\276/problem_solving_09.py" new file mode 100644 index 0000000000000000000000000000000000000000..e2eab3ff729ba764648c9e2b8a5223b8ad1563b6 --- /dev/null +++ "b/999-\347\256\227\346\263\225\346\200\235\346\203\263/01-\344\272\214\345\210\206\346\237\245\346\211\276/problem_solving_09.py" @@ -0,0 +1,30 @@ +""" +二分查找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)