Skip to content

Commit af33175

Browse files
committed
feat: add solutions to lcci problem: No.08.03
No.08.03.Magic Index
1 parent 8d2d3f3 commit af33175

File tree

4 files changed

+199
-0
lines changed

4 files changed

+199
-0
lines changed

lcci/08.03.Magic Index/README.md

+87
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,93 @@ func find(nums []int, left, right int) int {
151151
}
152152
```
153153

154+
### **TypeScript**
155+
156+
```ts
157+
function findMagicIndex(nums: number[]): number {
158+
const n = nums.length;
159+
const find = (l: number, r: number): number => {
160+
if (l > r) {
161+
return -1;
162+
}
163+
const mid = l + Math.floor((r - l) / 2);
164+
const l_res = find(l, mid - 1);
165+
if (l_res !== -1) {
166+
return l_res;
167+
}
168+
if (nums[mid] === mid) {
169+
return mid;
170+
}
171+
const r_res = find(mid + 1, r);
172+
if (r_res !== -1) {
173+
return r_res;
174+
}
175+
return -1;
176+
};
177+
return find(0, n - 1);
178+
}
179+
```
180+
181+
```ts
182+
function findMagicIndex(nums: number[]): number {
183+
const n = nums.length;
184+
let i = 0;
185+
while (i < n) {
186+
if (nums[i] === i) {
187+
return i;
188+
}
189+
i = Math.max(nums[i], i + 1);
190+
}
191+
return -1;
192+
}
193+
```
194+
195+
## **Rust**
196+
197+
```rust
198+
impl Solution {
199+
fn find(nums: &Vec<i32>, l: usize, r: usize) -> i32 {
200+
if l >= r {
201+
return -1;
202+
}
203+
let mid = l + (r - l) / 2;
204+
let l_res = Self::find(nums, l, mid);
205+
if l_res != -1 {
206+
return l_res;
207+
}
208+
if nums[mid] == mid as i32 {
209+
return mid as i32;
210+
}
211+
let r_res = Self::find(nums, mid + 1, r);
212+
if r_res != -1 {
213+
return r_res;
214+
}
215+
-1
216+
}
217+
218+
pub fn find_magic_index(nums: Vec<i32>) -> i32 {
219+
Self::find(&nums, 0, nums.len())
220+
}
221+
}
222+
```
223+
224+
```rust
225+
impl Solution {
226+
pub fn find_magic_index(nums: Vec<i32>) -> i32 {
227+
let n = nums.len();
228+
let mut i = 0 as i32;
229+
while (i as usize) < n {
230+
let num = nums[i as usize];
231+
if num == i {
232+
return i;
233+
}
234+
i = num.max(i + 1);
235+
}
236+
-1
237+
}
238+
}
239+
```
240+
154241
### **...**
155242

156243
```

lcci/08.03.Magic Index/README_EN.md

+87
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,93 @@ func find(nums []int, left, right int) int {
151151
}
152152
```
153153

154+
### **TypeScript**
155+
156+
```ts
157+
function findMagicIndex(nums: number[]): number {
158+
const n = nums.length;
159+
const find = (l: number, r: number): number => {
160+
if (l > r) {
161+
return -1;
162+
}
163+
const mid = l + Math.floor((r - l) / 2);
164+
const l_res = find(l, mid - 1);
165+
if (l_res !== -1) {
166+
return l_res;
167+
}
168+
if (nums[mid] === mid) {
169+
return mid;
170+
}
171+
const r_res = find(mid + 1, r);
172+
if (r_res !== -1) {
173+
return r_res;
174+
}
175+
return -1;
176+
};
177+
return find(0, n - 1);
178+
}
179+
```
180+
181+
```ts
182+
function findMagicIndex(nums: number[]): number {
183+
const n = nums.length;
184+
let i = 0;
185+
while (i < n) {
186+
if (nums[i] === i) {
187+
return i;
188+
}
189+
i = Math.max(nums[i], i + 1);
190+
}
191+
return -1;
192+
}
193+
```
194+
195+
## **Rust**
196+
197+
```rust
198+
impl Solution {
199+
fn find(nums: &Vec<i32>, l: usize, r: usize) -> i32 {
200+
if l >= r {
201+
return -1;
202+
}
203+
let mid = l + (r - l) / 2;
204+
let l_res = Self::find(nums, l, mid);
205+
if l_res != -1 {
206+
return l_res;
207+
}
208+
if nums[mid] == mid as i32 {
209+
return mid as i32;
210+
}
211+
let r_res = Self::find(nums, mid + 1, r);
212+
if r_res != -1 {
213+
return r_res;
214+
}
215+
-1
216+
}
217+
218+
pub fn find_magic_index(nums: Vec<i32>) -> i32 {
219+
Self::find(&nums, 0, nums.len())
220+
}
221+
}
222+
```
223+
224+
```rust
225+
impl Solution {
226+
pub fn find_magic_index(nums: Vec<i32>) -> i32 {
227+
let n = nums.len();
228+
let mut i = 0 as i32;
229+
while (i as usize) < n {
230+
let num = nums[i as usize];
231+
if num == i {
232+
return i;
233+
}
234+
i = num.max(i + 1);
235+
}
236+
-1
237+
}
238+
}
239+
```
240+
154241
### **...**
155242

156243
```

lcci/08.03.Magic Index/Solution.rs

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
impl Solution {
2+
pub fn find_magic_index(nums: Vec<i32>) -> i32 {
3+
let n = nums.len();
4+
let mut i = 0 as i32;
5+
while (i as usize) < n {
6+
let num = nums[i as usize];
7+
if num == i {
8+
return i;
9+
}
10+
i = num.max(i + 1);
11+
}
12+
-1
13+
}
14+
}

lcci/08.03.Magic Index/Solution.ts

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
function findMagicIndex(nums: number[]): number {
2+
const n = nums.length;
3+
let i = 0;
4+
while (i < n) {
5+
if (nums[i] === i) {
6+
return i;
7+
}
8+
i = Math.max(nums[i], i + 1);
9+
}
10+
return -1;
11+
}

0 commit comments

Comments
 (0)