提交 113944f5 编写于 作者: GreyZeng's avatar GreyZeng

update code

上级 2957f3ad
......@@ -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;
}
}
......@@ -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;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册