[分析]
思路1: 伪二分查找。若中间元素正好是target时,分四种小情况:1)左右边界也等于target时,当前这段就是要找的范围,可直接返回;2)只有左边界等于target,则右边界往左靠近一步;3)只有右边界等于target,则左边界往右靠近一步;4)左右边界均不等于target,则左右均往里逼近一步。容易看出在中间元素恰好是target时,算法退化为O(N)的。
思路2: 二分法依次查找target第一次出现和最后一次出现的位置。
[ref]
二分查找(Binary Search) 常见问题解决方法总结
http://blog.csdn.net/daniel_ustc/article/details/17307937
http://bangbingsyb.blogspot.com/2014/11/leetcode-search-for-range.html
public class Solution {
// Method 2: O(logN)
public int[] searchRange(int[] nums, int target) {
int[] result = {-1, -1};
if (nums == null || nums.length == 0)
return result;
result[0] = binarySearchFirst(nums, target);
if (result[0] != -1) {
result[1] = binarySearchLast(nums, target);
}
return result;
}
// 查找target在nums[]中第一次出现的下标,若找不到返回-1
public int binarySearchFirst(int[] nums, int target) {
if (nums == null || nums.length == 0)
return -1;
int left = 0, right = nums.length - 1;
int mid = 0;
while (left < right) { // 此处不能有等号,否则可能在right=mid处死循环,考虑case:[1], 1
mid = left + ((right - left) >> 1);
if (target > nums[mid])
left = mid + 1;
else
right = mid;
}
if (nums[left] == target)
return left;
return -1;
}
// 查找target在nums[]中最后一次出现的下标,若找不到返回-1
public int binarySearchLast(int[] nums, int target) {
if (nums == null || nums.length == 0)
return -1;
int left = 0, right = nums.length - 1;
int mid = 0;
while (left + 1 < right) { // 循环只处理元素个数大于两个的情况,两个以下元素时可能在left=mid处死循环(两个元素时left==mid),考虑case:[1,1],1
mid = left + ((right - left) >> 1);
if (target < nums[mid])
right = mid - 1;
else
left = mid;
}
if (nums[right] == target)
return right;
else if(nums[left] == target)
return left;
return -1;
}
// Method 1
public int[] searchRange1(int[] nums, int target) {
int[] result = {-1, -1};
if (nums == null || nums.length == 0)
return result;
int left = 0, right = nums.length - 1;
int mid = 0;
while (left <= right) {
mid = left + (right - left) / 2;
if (nums[mid] > target)
right = mid - 1;
else if (nums[mid] < target)
left = mid + 1;
else {
if (nums[left] == nums[mid] && nums[mid] == nums[right]) {
result[0] = left;
result[1] = right;
return result;
} else if (nums[left] == nums[mid]) {
right--;
} else if (nums[right] == nums[mid]) {
left++;
} else {
left++;
right--;
}
}
}
return result;
}
}
分享到:
相关推荐
《leetcode-solutions》,刷算法题,需要有一定的英文阅读能力。。。
IDEA 插件,lettcode刷题,leetcode-editor7.4版本下载进行本地导入(直接将压缩包拖进IDEA即可)
Algorithm-LeetCode-Sol-Res.zip,干净,易懂的解决方案和资源,为leetcode在线判断算法问题。,算法是为计算机程序高效、彻底地完成任务而创建的一组详细的准则。
Algorithm-leetcode-spider.zip,leetcode公司,算法是为计算机程序高效、彻底地完成任务而创建的一组详细的准则。
在IDE中解决LeetCode问题,支持leetcode.com与leetcode-cn.com,满足基本的做题需求。 理论上支持: IntelliJ IDEA PhpStorm WebStorm PyCharm RubyMine AppCode CLion GoLand DataGrip Rider MPS Android Studio。
leetcode-cli-plugins leetcode-cli 的第 3 方插件。 什么是 如何使用 如何使用 插件 名称 描述 增强的命令 按公司或标签过滤问题 list 不要在同一台计算机上使 Chrome 的会话过期 login 不要在同一台计算机上使 ...
970. 强整数对数运算function powerfulIntegers(x: number, y: number, bound: number): numb
leetcode 答案解析 golang解答
解题思路思路和LeetCode-python 503.下一个更大元素 II一致,只是这里求的是下标的距离,而不是数值倒序搜索,用到栈,栈里存储索引情况1:若栈为
leetcode-cheat 的发布 它是什么 ? 这是一个chrome 扩展,可以帮助您更高效地使用 leetcode。您可以从 重要: leetcode-cheat 现在只支持中文版。 也就是说不完全支持leetcode.com,但是你可以用leetcode-cn.com代替...
leetcode-helper-1.7.1
leetcode-tag-dynamic programming
~/.vscode/extensions/leetcode.vscode-leetcode-0.17.0/node_modules/vsc-leetcode-cli/bin/leetcode /usr/local/bin/leetcode 修改模板 open ~/.vscode/extensions/leetcode.vscode-leetcode-0.17.0/node_modules/...
leetcode-editor,在ide中做leetcode练习,支持leetcode.com和leetcode-cn.com,以满足练习的基本需求。理论上支持:intellij idea phpstorm webstorm pycharm rubymine appcode clion goland datagrip rider mps ...
leetcode-tag-Tree
leetcode-tag-Stack
leetcode-tag-array
Algorithm-LeetCode-Solution-From-GuaZiDou.zip,Leetcode解决方案Gitbook,算法是为计算机程序高效、彻底地完成任务而创建的一组详细的准则。
leetcode-cli 注意:这个存储库是为了临时使用而分叉的。 注意:从 webbrowser 复制 cookie 并使用leetcode user -c可以临时修复不能。 一个享受 leetcode 的高效 cli 工具! 非常感谢 leetcode.com,一个非常棒的...
leetcode-链表笔记