摘要:二分搜索復(fù)雜度時(shí)間空間思路其實(shí)就是執(zhí)行兩次二分搜索,一次專門找左邊邊界,一次找右邊邊界。如果找右邊邊界,則要判斷右邊一位的數(shù)是否相同。
Search for a Range
二分搜索 復(fù)雜度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].
時(shí)間 O(logN) 空間 O(1)
思路其實(shí)就是執(zhí)行兩次二分搜索,一次專門找左邊邊界,一次找右邊邊界。特別的,如果找左邊邊界時(shí),要看mid左邊一位的的數(shù)是否和當(dāng)前mid相同,如果相同要繼續(xù)在左半邊二分搜索。如果找右邊邊界,則要判斷右邊一位的數(shù)是否相同。
代碼public class Solution { public int[] searchRange(int[] nums, int target) { // 找到左邊界 int front = search(nums, target, "front"); // 找到右邊界 int rear = search(nums, target, "rear"); int[] res = {front, rear}; return res; } public int search(int[] nums, int target, String type){ int min = 0, max = nums.length - 1; while(min <= max){ int mid = min + (max - min) / 2; if(nums[mid] > target){ max = mid - 1; } else if(nums[mid] < target){ min = mid + 1; } else { // 對(duì)于找左邊的情況,要判斷左邊的數(shù)是否重復(fù) if(type == "front"){ if(mid == 0) return 0; if(nums[mid] != nums[mid - 1]) return mid; max = mid - 1; } else { // 對(duì)于找右邊的情況,要判斷右邊的數(shù)是否重復(fù) if(mid == nums.length - 1) return nums.length - 1; if(nums[mid] != nums[mid + 1]) return mid; min = mid + 1; } } } //沒找到該數(shù)返回-1 return -1; } }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/64648.html
摘要:我們要找出這個(gè)目標(biāo)數(shù)字在數(shù)組中的存在區(qū)間,并以數(shù)組形式返回這個(gè)區(qū)間。要求題目必須在輸入數(shù)組和目標(biāo)值返回想法我們需要分別找出最左邊的這個(gè)元素的位置和最右邊的這個(gè)元素的位置。由于對(duì)于時(shí)間的要求,我們?cè)谶M(jìn)行查找的時(shí)候要采取二分查找。 題目詳情 Given an array of integers sorted in ascending order, find the starting and...
摘要:想象一下假設(shè)數(shù)組前有一段連續(xù)的負(fù)無窮到,數(shù)組后有一段到正無窮,這樣是等價(jià)與上下界的。最后循環(huán)到停止,當(dāng)下標(biāo)為時(shí),我們將當(dāng)前指針指向,并判斷和數(shù)組末尾是否能構(gòu)成最后一個(gè)區(qū)間。 Missing Ranges Given a sorted integer array where the range of elements are [lower, upper] inclusive, retu...
摘要:雙層迭代法復(fù)雜度時(shí)間空間思路外層的循環(huán)控制每個(gè)的起點(diǎn),內(nèi)層的循環(huán)控制之內(nèi)的遞增。每當(dāng)遍歷完一個(gè),就把它記錄到結(jié)果中,并更新下一個(gè)的起點(diǎn)。這里的技巧是,判斷一個(gè)數(shù)是否是在內(nèi)的,只要就行了,即值之差等于下標(biāo)之差。 Summary Ranges Given a sorted integer array without duplicates, return the summary of it...
摘要:題目要求即在一個(gè)有序排列的數(shù)組中,找到目標(biāo)值所在的起始下標(biāo)和結(jié)束下標(biāo)。這樣一定可以找到目標(biāo)值的初始下標(biāo)同理,結(jié)合情況和情況,當(dāng)中間值大于目標(biāo)值,則將右指針左移至中間,否則將左指針右移至中間,這樣一定可以找到目標(biāo)值的結(jié)束下標(biāo)。 題目要求 Given an array of integers sorted in ascending order, find the starting and ...
摘要:寫在前面今天這篇文章是貪心算法系列的第三篇?jiǎng)澐肿帜竻^(qū)間。前文回顧貪心算法分發(fā)糖果刷題匯總匯總貼今日題目字符串由小寫字母組成。返回一個(gè)表示每個(gè)字符串片段的長(zhǎng)度的列表。示例輸入輸出解釋劃分結(jié)果為。每個(gè)字母最多出現(xiàn)在一個(gè)片段中。 寫在前面 今天這篇文章是貪心算法系列的第三篇--劃分字母區(qū)間。 前文回顧: 【LeetCode】貪心算法--分發(fā)糖果(135) 刷題匯總: 【LeetCode】匯總...
閱讀 3843·2021-11-25 09:43
閱讀 2184·2021-11-23 10:11
閱讀 1414·2021-09-29 09:35
閱讀 1359·2021-09-24 10:31
閱讀 2049·2019-08-30 15:48
閱讀 2366·2019-08-29 15:28
閱讀 439·2019-08-29 12:36
閱讀 3499·2019-08-28 18:12