Commit ffa7cb9
committed
34. Find First and Last Position of Element in Sorted Array
```Solution.c /** * Note: The returned array must be malloced, assume caller calls free(). */ int findBound(int* nums, int numsSize, int target, int first) { int l = 0, r = numsSize - 1, ans = -1; while (l <= r) { int mid = l + (r - l) / 2; if (nums[mid] == target) { ans = mid; if (first) r = mid - 1; else l = mid + 1; } else if (nums[mid] < target) l = mid + 1; else r = mid - 1; } return ans; } int* searchRange(int* nums, int numsSize, int target, int* returnSize) { int* res = (int*)malloc(2 * sizeof(int)); res[0] = findBound(nums, numsSize, target, 1); res[1] = findBound(nums, numsSize, target, 0); *returnSize = 2; return res; } ``` ```Solution.cpp class Solution { public: vector<int> searchRange(vector<int>& nums, int target) { return {findBound(nums, target, true), findBound(nums, target, false)}; } private: int findBound(vector<int>& nums, int target, bool first) { int l = 0, r = nums.size() - 1, ans = -1; while (l <= r) { int mid = l + (r - l) / 2; if (nums[mid] == target) { ans = mid; if (first) r = mid - 1; else l = mid + 1; } else if (nums[mid] < target) l = mid + 1; else r = mid - 1; } return ans; } }; ``` ```Solution.cs public class Solution { public int[] SearchRange(int[] nums, int target) { return new int[] { FindBound(nums, target, true), FindBound(nums, target, false) }; } private int FindBound(int[] nums, int target, bool first) { int l = 0, r = nums.Length - 1, ans = -1; while (l <= r) { int mid = l + (r - l) / 2; if (nums[mid] == target) { ans = mid; if (first) r = mid - 1; else l = mid + 1; } else if (nums[mid] < target) l = mid + 1; else r = mid - 1; } return ans; } } ``` ```Solution.dart class Solution { List<int> searchRange(List<int> nums, int target) { int findBound(bool first) { int l = 0, r = nums.length - 1, ans = -1; while (l <= r) { int mid = (l + r) >> 1; if (nums[mid] == target) { ans = mid; if (first) r = mid - 1; else l = mid + 1; } else if (nums[mid] < target) l = mid + 1; else r = mid - 1; } return ans; } return [findBound(true), findBound(false)]; } } ``` ```Solution.erl -spec search_range([integer()], integer()) -> [integer()]. search_range(Nums, Target) -> {L, R} = {find_bound(Nums, Target, true), find_bound(Nums, Target, false)}, [L, R]. find_bound(Nums, Target, First) -> loop(Nums, Target, 0, length(Nums)-1, -1, First). loop(Nums, Target, L, R, Ans, First) when L =< R -> Mid = (L + R) div 2, Val = lists:nth(Mid+1, Nums), if Val =:= Target -> if First -> loop(Nums, Target, L, Mid-1, Mid, First); true -> loop(Nums, Target, Mid+1, R, Mid, First) end; Val < Target -> loop(Nums, Target, Mid+1, R, Ans, First); true -> loop(Nums, Target, L, Mid-1, Ans, First) end; loop(_, _, _, _, Ans, _) -> Ans. ``` ```Solution.ex defmodule Solution do @SPEC search_range(nums :: [integer], target :: integer) :: [integer] def search_range(nums, target) do [find_bound(nums, target, true), find_bound(nums, target, false)] end defp find_bound(nums, target, first) do helper(nums, target, 0, length(nums) - 1, -1, first) end defp helper(nums, target, l, r, ans, first) when l <= r do mid = div(l + r, 2) val = Enum.at(nums, mid) cond do val == target -> if first, do: helper(nums, target, l, mid - 1, mid, first), else: helper(nums, target, mid + 1, r, mid, first) val < target -> helper(nums, target, mid + 1, r, ans, first) true -> helper(nums, target, l, mid - 1, ans, first) end end defp helper(_, _, _, _, ans, _), do: ans end ``` ```Solution.go func searchRange(nums []int, target int) []int { findBound := func(first bool) int { l, r, ans := 0, len(nums)-1, -1 for l <= r { mid := (l + r) / 2 if nums[mid] == target { ans = mid if first { r = mid - 1 } else { l = mid + 1 } } else if nums[mid] < target { l = mid + 1 } else { r = mid - 1 } } return ans } return []int{findBound(true), findBound(false)} } ``` ```Solution.java class Solution { public int[] searchRange(int[] nums, int target) { return new int[]{findBound(nums, target, true), findBound(nums, target, false)}; } private int findBound(int[] nums, int target, boolean first) { int l = 0, r = nums.length - 1, ans = -1; while (l <= r) { int mid = l + (r - l) / 2; if (nums[mid] == target) { ans = mid; if (first) r = mid - 1; else l = mid + 1; } else if (nums[mid] < target) l = mid + 1; else r = mid - 1; } return ans; } } ``` ```Solution.js /** * @param {number[]} nums * @param {number} target * @return {number[]} */ var searchRange = function(nums, target) { function findBound(first) { let l = 0, r = nums.length - 1, ans = -1; while (l <= r) { let mid = Math.floor((l + r) / 2); if (nums[mid] === target) { ans = mid; if (first) r = mid - 1; else l = mid + 1; } else if (nums[mid] < target) l = mid + 1; else r = mid - 1; } return ans; } return [findBound(true), findBound(false)]; }; ``` ```Solution.kt class Solution { fun searchRange(nums: IntArray, target: Int): IntArray { fun findBound(first: Boolean): Int { var l = 0; var r = nums.size - 1; var ans = -1 while (l <= r) { val mid = (l + r) / 2 if (nums[mid] == target) { ans = mid if (first) r = mid - 1 else l = mid + 1 } else if (nums[mid] < target) l = mid + 1 else r = mid - 1 } return ans } return intArrayOf(findBound(true), findBound(false)) } } ``` ```Solution.php class Solution { /** * @param Integer[] $nums * @param Integer $target * @return Integer[] */ function searchRange($nums, $target) { $findBound = function($first) use ($nums, $target) { $l = 0; $r = count($nums) - 1; $ans = -1; while ($l <= $r) { $mid = intdiv($l + $r, 2); if ($nums[$mid] == $target) { $ans = $mid; if ($first) $r = $mid - 1; else $l = $mid + 1; } elseif ($nums[$mid] < $target) $l = $mid + 1; else $r = $mid - 1; } return $ans; }; return [$findBound(true), $findBound(false)]; } } ``` ```Solution.py class Solution: def searchRange(self, nums: List[int], target: int) -> List[int]: def findBound(first: bool) -> int: l, r, ans = 0, len(nums) - 1, -1 while l <= r: mid = (l + r) // 2 if nums[mid] == target: ans = mid if first: r = mid - 1 else: l = mid + 1 elif nums[mid] < target: l = mid + 1 else: r = mid - 1 return ans return [findBound(True), findBound(False)] ``` ```Solution.rb # @param {Integer[]} nums # @param {Integer} target # @return {Integer[]} def search_range(nums, target) find_bound = ->(first) { l, r, ans = 0, nums.length - 1, -1 while l <= r mid = (l + r) / 2 if nums[mid] == target ans = mid if first r = mid - 1 else l = mid + 1 end elsif nums[mid] < target l = mid + 1 else r = mid - 1 end end ans } [find_bound.call(true), find_bound.call(false)] end ``` ```Solution.rkt (define (search-range nums target) (define (findBound first?) (define (loop l r ans) (if (> l r) ans (let* ([mid (quotient (+ l r) 2)] [val (list-ref nums mid)]) (cond [(= val target) (loop (if first? l (+ mid 1)) (if first? (- mid 1) r) mid)] [(< val target) (loop (+ mid 1) r ans)] [else (loop l (- mid 1) ans)])))) (loop 0 (sub1 (length nums)) -1)) (list (findBound #t) (findBound #f))) ``` ```Solution.rs impl Solution { pub fn search_range(nums: Vec<i32>, target: i32) -> Vec<i32> { fn find_bound(nums: &Vec<i32>, target: i32, first: bool) -> i32 { let (mut l, mut r) = (0, nums.len() as i32 - 1); let mut ans = -1; while l <= r { let mid = l + (r - l) / 2; if nums[mid as usize] == target { ans = mid; if first { r = mid - 1; } else { l = mid + 1; } } else if nums[mid as usize] < target { l = mid + 1; } else { r = mid - 1; } } ans } vec![find_bound(&nums, target, true), find_bound(&nums, target, false)] } } ``` ```Solution.scala object Solution { def searchRange(nums: Array[Int], target: Int): Array[Int] = { def findBound(first: Boolean): Int = { var l = 0 var r = nums.length - 1 var ans = -1 while (l <= r) { val mid = (l + r) / 2 if (nums(mid) == target) { ans = mid if (first) r = mid - 1 else l = mid + 1 } else if (nums(mid) < target) l = mid + 1 else r = mid - 1 } ans } Array(findBound(true), findBound(false)) } } ``` ```Solution.swift class Solution { func searchRange(_ nums: [Int], _ target: Int) -> [Int] { func findBound(_ first: Bool) -> Int { var l = 0, r = nums.count - 1, ans = -1 while l <= r { let mid = (l + r) / 2 if nums[mid] == target { ans = mid if first { r = mid - 1 } else { l = mid + 1 } } else if nums[mid] < target { l = mid + 1 } else { r = mid - 1 } } return ans } return [findBound(true), findBound(false)] } } ``` ```Solution.ts function searchRange(nums: number[], target: number): number[] { function findBound(first: boolean): number { let l = 0, r = nums.length - 1, ans = -1; while (l <= r) { let mid = Math.floor((l + r) / 2); if (nums[mid] === target) { ans = mid; if (first) r = mid - 1; else l = mid + 1; } else if (nums[mid] < target) l = mid + 1; else r = mid - 1; } return ans; } return [findBound(true), findBound(false)]; } ```1 parent b9272fe commit ffa7cb9
File tree
19 files changed
+383
-0
lines changed- sol/solution/0001-0100/0034
19 files changed
+383
-0
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
0 commit comments