From 303f5c92c62067382f374dfd86d6b089a46e52f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=A6=E8=8B=B1=E6=9D=B0?= <327782001@qq.com> Date: Wed, 19 Jul 2023 16:04:33 +0800 Subject: [PATCH] =?UTF-8?q?fix:=E4=BA=8C=E5=88=86=E6=9F=A5=E6=89=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../problem_solving_01.py" | 29 ++++++++++++++++ .../problem_solving_02.py" | 30 ++++++++++++++++ .../problem_solving_03.py" | 28 +++++++++++++++ .../problem_solving_04.py" | 30 ++++++++++++++++ .../problem_solving_05.py" | 34 +++++++++++++++++++ .../problem_solving_06.py" | 34 +++++++++++++++++++ .../problem_solving_07.py" | 30 ++++++++++++++++ .../problem_solving_08.py" | 30 ++++++++++++++++ .../problem_solving_09.py" | 30 ++++++++++++++++ 9 files changed, 275 insertions(+) create mode 100644 "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" create mode 100644 "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" create mode 100644 "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" create mode 100644 "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" create mode 100644 "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" create mode 100644 "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" create mode 100644 "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" create mode 100644 "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" create mode 100644 "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" 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 0000000..e874c03 --- /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 0000000..806259e --- /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 0000000..235d4d8 --- /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 0000000..b452d92 --- /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 0000000..469336f --- /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 0000000..4d47251 --- /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 0000000..a8893d8 --- /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 0000000..5838af1 --- /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 0000000..e2eab3f --- /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) -- GitLab