内容不相关的网站做301重定向,如何作做网站,wordpress菜单选项如何链接,自己做的网站别人打不开给你一个按照非递减顺序排列的整数数组 nums#xff0c;和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target#xff0c;返回 [-1, -1]。
你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。 示例 1#xff1a…给你一个按照非递减顺序排列的整数数组 nums和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target返回 [-1, -1]。
你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。 示例 1
输入nums [5,7,7,8,8,10], target 8
输出[3,4]
示例 2
输入nums [5,7,7,8,8,10], target 6
输出[-1,-1]
示例 3
输入nums [], target 0
输出[-1,-1]
思路
寻找target在数组里的左右边界有如下三种情况
情况一target 在数组范围的右边或者左边例如数组{3, 4, 5}target为2或者数组{3, 4, 5},target为6此时应该返回{-1, -1}情况二target 在数组范围中且数组中不存在target例如数组{3,6,7},target为5此时应该返回{-1, -1}情况三target 在数组范围中且数组中存在target例如数组{3,6,7},target为6此时应该返回{1, 1}
错误解法
按照我自己的思路用传统二分不知道为什么超时有知道的大佬可以指点一下我的错误代码
public int[] searchRange(int[] nums, int target) {int arr[]{-1,-1};if (targetnums[0]||targetnums[nums.length-1])return arr;int l0,rnums.length-1;while (lr){int midl((r-l)1);if (nums[mid]target){if (arr[0]-1){arr[0]mid;arr[1]mid;}else {arr[1]mid;}}else if(nums[mid]target)lmid1;else if (nums[mid]target)rmid-1;}return arr;} 正确代码 下面换了个思路就AK了 以下是代码
public int[] searchRange(int[] nums, int target) {int indexbinarySearch(nums,target);if (index-1)return new int[]{-1,-1};int lindex,rindex;while (l-10nums[l-1]nums[index])l--;while (r1nums.length-1nums[r1]nums[index])r;return new int[]{l,r};}public int binarySearch(int[] nums, int target) {int left 0;int right nums.length - 1; // 不变量左闭右闭区间while (left right) { // 不变量左闭右闭区间int mid left (right - left) / 2;if (nums[mid] target) {return mid;} else if (nums[mid] target) {left mid 1;} else {right mid - 1; // 不变量左闭右闭区间}}return -1; // 不存在}