Skip to content

Commit ffa7cb9

Browse files
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

19 files changed

+383
-0
lines changed
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
# [**34. Find First and Last Position of Element in Sorted Array**](https://leetcode.com/problems/find-first-and-last-position-of-element-in-sorted-array/description/)
2+
3+
Given an array of integers nums sorted in non-decreasing order, find the starting and ending position of a given `target` value.<br>
4+
If `target` is not found in the array, return `[-1, -1]`.
5+
6+
You must write an algorithm with `O(log n)` runtime complexity.
7+
8+
#### **Example 1:**
9+
```md
10+
Input: nums = [5,7,7,8,8,10], target = 8
11+
Output: [3,4]
12+
```
13+
14+
#### **Example 2:**
15+
```md
16+
Input: nums = [5,7,7,8,8,10], target = 6
17+
Output: [-1,-1]
18+
```
19+
20+
#### **Example 3:**
21+
```md
22+
Input: nums = [], target = 0
23+
Output: [-1,-1]
24+
```
25+
26+
#### **Constraints:**
27+
> - `0 <= nums.length <= 10⁵`
28+
> - `-10⁹ <= nums[i] <= 10⁹`
29+
> - `nums` is a non-decreasing array.
30+
> - `-10⁹ <= target <= 10⁹`
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/**
2+
* Note: The returned array must be malloced, assume caller calls free().
3+
*/
4+
int findBound(int* nums, int numsSize, int target, int first) {
5+
int l = 0, r = numsSize - 1, ans = -1;
6+
while (l <= r) {
7+
int mid = l + (r - l) / 2;
8+
if (nums[mid] == target) {
9+
ans = mid;
10+
if (first) r = mid - 1;
11+
else l = mid + 1;
12+
} else if (nums[mid] < target) l = mid + 1;
13+
else r = mid - 1;
14+
}
15+
return ans;
16+
}
17+
int* searchRange(int* nums, int numsSize, int target, int* returnSize) {
18+
int* res = (int*)malloc(2 * sizeof(int));
19+
res[0] = findBound(nums, numsSize, target, 1);
20+
res[1] = findBound(nums, numsSize, target, 0);
21+
*returnSize = 2;
22+
return res;
23+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
class Solution {
2+
public:
3+
vector<int> searchRange(vector<int>& nums, int target) {
4+
return {findBound(nums, target, true), findBound(nums, target, false)};
5+
}
6+
private:
7+
int findBound(vector<int>& nums, int target, bool first) {
8+
int l = 0, r = nums.size() - 1, ans = -1;
9+
while (l <= r) {
10+
int mid = l + (r - l) / 2;
11+
if (nums[mid] == target) {
12+
ans = mid;
13+
if (first) r = mid - 1;
14+
else l = mid + 1;
15+
} else if (nums[mid] < target) l = mid + 1;
16+
else r = mid - 1;
17+
}
18+
return ans;
19+
}
20+
};
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
public class Solution {
2+
public int[] SearchRange(int[] nums, int target) {
3+
return new int[] { FindBound(nums, target, true), FindBound(nums, target, false) };
4+
}
5+
private int FindBound(int[] nums, int target, bool first) {
6+
int l = 0, r = nums.Length - 1, ans = -1;
7+
while (l <= r) {
8+
int mid = l + (r - l) / 2;
9+
if (nums[mid] == target) {
10+
ans = mid;
11+
if (first) r = mid - 1;
12+
else l = mid + 1;
13+
} else if (nums[mid] < target) l = mid + 1;
14+
else r = mid - 1;
15+
}
16+
return ans;
17+
}
18+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
class Solution {
2+
List<int> searchRange(List<int> nums, int target) {
3+
int findBound(bool first) {
4+
int l = 0, r = nums.length - 1, ans = -1;
5+
while (l <= r) {
6+
int mid = (l + r) >> 1;
7+
if (nums[mid] == target) {
8+
ans = mid;
9+
if (first) r = mid - 1;
10+
else l = mid + 1;
11+
} else if (nums[mid] < target) l = mid + 1;
12+
else r = mid - 1;
13+
}
14+
return ans;
15+
}
16+
return [findBound(true), findBound(false)];
17+
}
18+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
-spec search_range([integer()], integer()) -> [integer()].
2+
search_range(Nums, Target) ->
3+
{L, R} = {find_bound(Nums, Target, true), find_bound(Nums, Target, false)},
4+
[L, R].
5+
find_bound(Nums, Target, First) ->
6+
loop(Nums, Target, 0, length(Nums)-1, -1, First).
7+
loop(Nums, Target, L, R, Ans, First) when L =< R ->
8+
Mid = (L + R) div 2,
9+
Val = lists:nth(Mid+1, Nums),
10+
if Val =:= Target ->
11+
if First -> loop(Nums, Target, L, Mid-1, Mid, First);
12+
true -> loop(Nums, Target, Mid+1, R, Mid, First)
13+
end;
14+
Val < Target -> loop(Nums, Target, Mid+1, R, Ans, First);
15+
true -> loop(Nums, Target, L, Mid-1, Ans, First)
16+
end;
17+
loop(_, _, _, _, Ans, _) -> Ans.
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
defmodule Solution do
2+
@spec search_range(nums :: [integer], target :: integer) :: [integer]
3+
def search_range(nums, target) do
4+
[find_bound(nums, target, true), find_bound(nums, target, false)]
5+
end
6+
defp find_bound(nums, target, first) do
7+
helper(nums, target, 0, length(nums) - 1, -1, first)
8+
end
9+
defp helper(nums, target, l, r, ans, first) when l <= r do
10+
mid = div(l + r, 2)
11+
val = Enum.at(nums, mid)
12+
cond do
13+
val == target ->
14+
if first,
15+
do: helper(nums, target, l, mid - 1, mid, first),
16+
else: helper(nums, target, mid + 1, r, mid, first)
17+
val < target -> helper(nums, target, mid + 1, r, ans, first)
18+
true -> helper(nums, target, l, mid - 1, ans, first)
19+
end
20+
end
21+
defp helper(_, _, _, _, ans, _), do: ans
22+
end
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
func searchRange(nums []int, target int) []int {
2+
findBound := func(first bool) int {
3+
l, r, ans := 0, len(nums)-1, -1
4+
for l <= r {
5+
mid := (l + r) / 2
6+
if nums[mid] == target {
7+
ans = mid
8+
if first {
9+
r = mid - 1
10+
} else {
11+
l = mid + 1
12+
}
13+
} else if nums[mid] < target {
14+
l = mid + 1
15+
} else {
16+
r = mid - 1
17+
}
18+
}
19+
return ans
20+
}
21+
return []int{findBound(true), findBound(false)}
22+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
class Solution {
2+
public int[] searchRange(int[] nums, int target) {
3+
return new int[]{findBound(nums, target, true), findBound(nums, target, false)};
4+
}
5+
private int findBound(int[] nums, int target, boolean first) {
6+
int l = 0, r = nums.length - 1, ans = -1;
7+
while (l <= r) {
8+
int mid = l + (r - l) / 2;
9+
if (nums[mid] == target) {
10+
ans = mid;
11+
if (first) r = mid - 1;
12+
else l = mid + 1;
13+
} else if (nums[mid] < target) l = mid + 1;
14+
else r = mid - 1;
15+
}
16+
return ans;
17+
}
18+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
/**
2+
* @param {number[]} nums
3+
* @param {number} target
4+
* @return {number[]}
5+
*/
6+
var searchRange = function(nums, target) {
7+
function findBound(first) {
8+
let l = 0, r = nums.length - 1, ans = -1;
9+
while (l <= r) {
10+
let mid = Math.floor((l + r) / 2);
11+
if (nums[mid] === target) {
12+
ans = mid;
13+
if (first) r = mid - 1;
14+
else l = mid + 1;
15+
} else if (nums[mid] < target) l = mid + 1;
16+
else r = mid - 1;
17+
}
18+
return ans;
19+
}
20+
return [findBound(true), findBound(false)];
21+
};

0 commit comments

Comments
 (0)