From 113944f5c9d8eeeddfe268561c9d20ffdb708bc5 Mon Sep 17 00:00:00 2001 From: GreyZeng <410486047@qq.com> Date: Wed, 22 Nov 2023 15:14:59 +0800 Subject: [PATCH] update code --- ...AndLastPositionOfElementInSortedArray.java | 57 ++++++++++--------- .../LeetCode_0162_FindPeakElement.java | 42 ++++++++------ 2 files changed, 55 insertions(+), 44 deletions(-) diff --git a/src/main/java/git/snippet/binarysearch/LeetCode_0034_FindFirstAndLastPositionOfElementInSortedArray.java b/src/main/java/git/snippet/binarysearch/LeetCode_0034_FindFirstAndLastPositionOfElementInSortedArray.java index 3ee90a4b..f7e9a5a5 100644 --- a/src/main/java/git/snippet/binarysearch/LeetCode_0034_FindFirstAndLastPositionOfElementInSortedArray.java +++ b/src/main/java/git/snippet/binarysearch/LeetCode_0034_FindFirstAndLastPositionOfElementInSortedArray.java @@ -5,51 +5,52 @@ package git.snippet.binarysearch; // 如果数组中不存在目标值 target,返回[-1, -1]。 // 你必须设计并实现时间复杂度为O(log n)的算法解决此问题。 // https://www.cnblogs.com/greyzeng/p/16622554.html +// https://www.lintcode.com/problem/1536/ // https://leetcode.com/problems/find-first-and-last-position-of-element-in-sorted-array/description/ public class LeetCode_0034_FindFirstAndLastPositionOfElementInSortedArray { public int[] searchRange(int[] nums, int target) { return new int[]{left(nums, target), right(nums, target)}; } - private int left(int[] nums, int target) { - if (nums == null || nums.length < 1) { + public int left(int[] nums, int target) { + if (nums == null || nums.length == 0) { return -1; } - int l = 0; - int r = nums.length - 1; - int ans = -1; - while (l <= r) { - int m = l + ((r - l) >> 1); - if (nums[m] == target) { - ans = m; - r = m - 1; - } else if (nums[m] > target) { - r = m - 1; + int left = 0; + int right = nums.length - 1; + int result = -1; + while (left <= right) { + int mid = left + ((right - left) >> 1); + if (nums[mid] == target) { + result = mid; + right = mid - 1; + } else if (nums[mid] < target) { + left = mid + 1; } else { - l = m + 1; + right = mid - 1; } } - return ans; + return result; } - private int right(int[] nums, int target) { - if (nums == null || nums.length < 1) { + public int right(int[] nums, int target) { + if (nums == null || nums.length == 0) { return -1; } - int l = 0; - int r = nums.length - 1; - int ans = -1; - while (l <= r) { - int m = l + ((r - l) >> 1); - if (nums[m] == target) { - ans = m; - l = m + 1; - } else if (nums[m] < target) { - l = m + 1; + int left = 0; + int right = nums.length - 1; + int result = -1; + while (left <= right) { + int mid = left + ((right - left) >> 1); + if (nums[mid] == target) { + result = mid; + left = mid + 1; + } else if (nums[mid] < target) { + left = mid + 1; } else { - r = m - 1; + right = mid - 1; } } - return ans; + return result; } } diff --git a/src/main/java/git/snippet/binarysearch/LeetCode_0162_FindPeakElement.java b/src/main/java/git/snippet/binarysearch/LeetCode_0162_FindPeakElement.java index 0ed28784..48ee10d5 100644 --- a/src/main/java/git/snippet/binarysearch/LeetCode_0162_FindPeakElement.java +++ b/src/main/java/git/snippet/binarysearch/LeetCode_0162_FindPeakElement.java @@ -13,29 +13,39 @@ package git.snippet.binarysearch; // 笔记:https://www.cnblogs.com/greyzeng/p/16622554.html public class LeetCode_0162_FindPeakElement { public int findPeakElement(int[] nums) { + // 处理 nums <= 2 的情况 if (nums.length == 1) { return 0; } if (nums.length == 2) { return nums[0] > nums[1] ? 0 : 1; } - int l = 0; - int r = nums.length - 1; - while (l <= r) { - if (nums[l] > nums[l + 1]) { - return l; - } - if (nums[r] > nums[r - 1]) { - return r; - } - int m = l + ((r - l) >> 1); - if (nums[m] > nums[m - 1] && nums[m] > nums[m + 1]) { - return m; - } else if (nums[m] < nums[m - 1]) { - r = m - 1; + int left = 0; + int right = nums.length - 1; + if (nums[left] > nums[left + 1]) { + return left; + } else { + left = left + 1; + } + if (nums[right] > nums[right - 1]) { + return right; + } else { + right = right - 1; + } + if (left == right) { + return left; + } + while (left <= right) { + int mid = left + ((right - left) >> 1); + if (nums[mid] > nums[mid + 1] && nums[mid] > nums[mid - 1]) { + return mid; + } else if (nums[mid] > nums[mid + 1]) { + right = mid - 1; + } else if (nums[mid] > nums[mid - 1]) { + left = mid + 1; } else { - // nums[m] < nums[m + 1] - l = m + 1; + // nums[mid] < nums[mid - 1] && nums[mid] < nums[mid + 1] + left = mid + 1; } } return -1; -- GitLab