(本博文作废,算法太挫,新博文将代码压缩至一半以下,可读性也更好)
新博文地址:[leetcode]Search for a Range
Given a sorted array of integers, find the starting and ending position of a given target value.
Your algorithm's runtime complexity must be in the order of O(log n).
If the target is not found in the array, return [-1, -1].
For example,
Given [5, 7, 7, 8, 8, 10] and target value 8,
return [3, 4].
Your algorithm's runtime complexity must be in the order of O(log n).
If the target is not found in the array, return [-1, -1].
For example,
Given [5, 7, 7, 8, 8, 10] and target value 8,
return [3, 4].
要求时间复杂度为O(log n),再加上排序的条件,毫无疑问需要二分查找。return[-1,-1]的判断很容易,不再啰嗦。当找到target之后,需要将数组a分为两段,并在前半段寻找target的前驱,在后半段寻找target的后驱。毫无疑问,还得用折半查找。
这个程序目前在leetcode做的100+道题中,代码最长的一道,时间复杂度O(log n),空间复杂度O(1),效率已经不需要优化了,只不过代码长的我看着都恶心,不过好在都是重复代码,不存在可读性的问题。我是有多懒得动脑子啊。。。。o(╯□╰)o
public int[] searchRange(int[] A, int target) { int index = fillIndex(A,target); if(index == -1){ return new int[]{-1,-1}; } int begin = findBegin(A,0,index,target); int end = findEnd(A,index,A.length - 1,target); return new int[]{begin,end}; } private int fillIndex(int[] a,int target){//找到target,找不到则返回-1 int begin = 0; int end = a.length - 1; while(begin <= end){ int mid = (begin + end) >> 1; if(a[mid] == target){ return mid; }else if(a[mid] > target){ end = mid - 1; }else{ begin = mid + 1; } } return -1; } private int findBegin(int[] a,int begin ,int end,int target){//在前半段找target的前驱 while(begin <= end){ int mid = (begin + end)>>1; if(a[mid] == target){ end = mid - 1; if(end < begin ){ break; } if(a[end] < target){ return mid; } }else if(a[mid] < target){ begin = mid + 1; if(begin == a.length){ break; } if(a[begin] == target){ return begin; } } } return 0; } private int findEnd(int[] a,int begin,int end,int target){//在后半段找target的后驱 while(begin <= end){ int mid = (begin + end)>>1; if(a[mid] == target){ begin = mid + 1; if(begin == a.length){ break; } if(a[begin] > target){ return mid; } }else if(a[mid] > target){ end = mid - 1; if(end < begin ){ break; } if(a[end] == target){ return end; } } } return a.length - 1; }
相关推荐
大佬的leetcode刷题笔记(c++版本)
Best LeetCode friend for geek.
LeetCode 刷题笔记
彩色版本 正版 pdf 精讲数据结构 + 算法 链表 树 图表 贪心算法 指针 动态规划 查找算法
刷LeetCode刷LeetCode刷LeetCode刷LeetCode刷LeetCode
leetcode上的题目,网站上测试通过,可以借鉴下
970. 强整数对数运算function powerfulIntegers(x: number, y: number, bound: number): numb
LeetCode 101:和你一起你轻松刷题 作者:高畅 Chang Gao 版本:正式版 1.04
leetcode中文版
vs code LeetCode 插件
1. Introduction 2. Array i. Remove Element ii. Remove Duplicates from Sorted Array iii....iv....v....vi....vii....viii....ix....x.... Search for a Range xiii. Search Insert Position xiv. Find Peak Element
LCP 44. 开幕式焰火递归 + 哈希* Definition for a binary tree node.: TreeNode | null, right
leetcode 锈impl-leetcode-for-rust Rust 中的 LeetCode 解决方案。
46. 全排列var permute = function (nums) {function dfs(results, nums, first) {for (l
100个leetCode详细解答