Skip to content

Commit 89695f7

Browse files
author
luzhipeng
committed
1 parent 5eb2608 commit 89695f7

6 files changed

+125
-0
lines changed

README.en.md

+1
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@ The data structures mainly includes:
132132
- [0019. Remove Nth Node From End of List](./problems/19.removeNthNodeFromEndofList.md)
133133
- [0024. Swap Nodes In Pairs](./problems/24.swapNodesInPairs.md)
134134
- [0029.divide-two-integers](./problems/29.divide-two-integers.md) 🆕
135+
- [0033.search-in-rotated-sorted-array](./problems/33.search-in-rotated-sorted-array.md) 🆕
135136
- [0039.combination-sum](./problems/39.combination-sum.md)
136137
- [0040.combination-sum-ii](./problems/40.combination-sum-ii.md)
137138
- [0046.permutations](./problems/46.permutations.md)

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@ leetcode 题解,记录自己的 leetcode 解题之路。
132132
- [0019. Remove Nth Node From End of List](./problems/19.removeNthNodeFromEndofList.md)
133133
- [0024. Swap Nodes In Pairs](./problems/24.swapNodesInPairs.md)
134134
- [0029.divide-two-integers](./problems/29.divide-two-integers.md) 🆕
135+
- [0033.search-in-rotated-sorted-array](./problems/33.search-in-rotated-sorted-array.md) 🆕
135136
- [0039.combination-sum](./problems/39.combination-sum.md)
136137
- [0040.combination-sum-ii](./problems/40.combination-sum-ii.md)
137138
- [0046.permutations](./problems/46.permutations.md)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
<mxfile modified="2019-06-25T08:29:45.719Z" host="www.draw.io" agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36" etag="mL01lY1iAOqhLc-0r-Ae" version="10.8.0" type="device"><diagram id="957mmXiTEQiwaOJpB0L8" name="第 1 页">7Vtdj6M2FP01fkwENubjETKw1WorrTSqOm8VA06ChuAUPJukv762YxLAzO5MmwSPlDwkcLGNOef4+vo6ALTY7L/U6Xb9O81JCaCV7wF6ABB62OHfwnA4GvwAHQ2rusiPJvtseCz+IcpoKetrkZOmV5BRWrJi2zdmtKpIxnq2tK7prl9sScv+XbfpimiGxywtdeufRc7W6imgd7b/RorVur2z7QbHK5u0LayepFmnOd11TCgGaFFTyo5Hm/2ClAK7FpdjveSNq6eO1aRi76nwPfn68uQ/fcu+RtV65y6f/vjy90y18iMtX9UDu6q37NBCUNPXKieiFQugaLcuGHncppm4uuOcc9uabUp+ZvND1R6pGdm/2VH79PhcNoRuCKsPvEhbwVWIHVpM1fnuTABWpnUH+9aWKspXp5bPqPADBcwHQIIaSN7kIJ0GiCkgIQ0kf3qQTFOSo4FkTw4SMk1JWAMJ/j+QlkVZLmhJa1kXLf2MZBm3N6ymL6Rz5dnHDrYuBKtp2nM1WNHk2nNM056ngeRMD5JpSvI1kPDkIGHTlNTe/3KhVZ42a1nWPvmuNiSFV4q83KlB1J3WZ5wLHAjnuIcswl5rmQxb3dcZMCF4JiKlO7zpZwVspKYCE6cGEzUF9emBpfWK8PuG3Kzriz8/60PTd1kVrcjAvylTWharip9mHC/C7ZFAs8jSMlQXNkWei9uMctFnqzcHLWnFOh4zSRD/KLvK5MALeVDs9xm07TEGgxEGEb4Wg0bmThzPQK1DDanpEyh2YCJSRmZRjNSUiakUaKSm9HwKiF0QLIAfgBiDKAR+AuIA+AiEvrD4PvB1V2boBKQmGr5S0CYkS34uFJhqg6AT1HeotR08MgddjVt9fSS59UBo3bl991SgBYhGcKuvzzTetrQQsMc/+JM2LXPtPlMPUusd9JbpMym/06ZgBR3l9NugwDNljG5GSGd0O6YN3rWt6PlmvxKbhfNNk6VknpNtTbKUkXy+pQ0v+ZfcuNMX65YVLRJ4W21gNBz3HSff0Qa8pUtHeugJYg8EDohsEDty2PMfPty5l1fjPgERArEPohhEwbsmgJhX4WUWsp1IehQXhA8glC1H3Me4/QZ/5XWO3QgT2UXeIJadjkDkiOp+LC2+LPwg21mIFu6+qhdiaHrErjumR3dEkMHVBKlH+A1fzrI7eYP86sCVOHp+1RnhDV6Nt7H4YehIoByLlhzTylS9bhqAoyPHmFfjt7d0PwHHXJAjPEbo3WPQ/7DnP5AP0uVz43E/EqOMT0R80hCc9/XDMRfqEVZfVHpLZ6TKf6IylTcTdQIQJHfNXXa+6W8JOd7kmtOz8QjNG5LW2XpWVLOaMhFLzhpaix8eS6aHT0aqzJoOSPXi0I0vNQ/5wwWPj/FIEIHGJiPbuhqz+u6BGtvQLQVdzzU/WjEJgm759BSfEuiXWLdALRVlj61pbxpuOPqmx/Qpc4iHSLl4LKK+7R/F9BXe9ClzZJmIlL70mD5ljozUlL65MH3K3DFSU/rmwj2t+nHHqkUZHrQnT6s6I9shQ97aPGWxkW8HdAkcz3T+MkEqU6tRmr2sJDfdfyDJDy8ibxY22+NbDIKDtD1ZFntBYKT687BmTLz+EAokYJLlFZoXGa2WBWe9nmf8jjDJU5byH2Fv+O+yJmSG8tmqpE1zmMm08ZKLZiYKzBoRYyUul33yQErCyHxbrYbS0f9ydkMxofZPOK2URrNenqMrqbV9QEn89PxehrzWebkFxf8C</diagram></mxfile>
Loading
Loading
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
## 题目地址
2+
https://leetcode.com/problems/search-in-rotated-sorted-array/
3+
4+
## 题目描述
5+
6+
```
7+
Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.
8+
9+
(i.e., [0,1,2,4,5,6,7] might become [4,5,6,7,0,1,2]).
10+
11+
You are given a target value to search. If found in the array return its index, otherwise return -1.
12+
13+
You may assume no duplicate exists in the array.
14+
15+
Your algorithm's runtime complexity must be in the order of O(log n).
16+
17+
Example 1:
18+
19+
Input: nums = [4,5,6,7,0,1,2], target = 0
20+
Output: 4
21+
Example 2:
22+
23+
Input: nums = [4,5,6,7,0,1,2], target = 3
24+
Output: -1
25+
26+
```
27+
28+
## 思路
29+
30+
这是一个我在网上看到的前端头条技术终面的一个算法题。
31+
32+
题目要求时间复杂度为logn,因此基本就是二分法了。 这道题目不是直接的有序数组,不然就是easy了。
33+
34+
首先要知道,我们随便选择一个点,将数组分为前后两部分,其中一部分一定是有序的。
35+
36+
具体步骤:
37+
38+
- 我们可以先找出mid,然后根据mid来判断,mid是在有序的部分还是无序的部分
39+
40+
假如mid小于start,则mid一定在右边有序部分。
41+
假如mid大于等于start, 则mid一定在左边有序部分。
42+
43+
> 注意等号的考虑
44+
45+
- 然后我们继续判断target在哪一部分, 我们就可以舍弃另一部分了
46+
47+
我们只需要比较target和有序部分的边界关系就行了。 比如mid在右侧有序部分,即[mid, end]
48+
那么我们只需要判断 target >= mid && target <= end 就能知道target在右侧有序部分,我们就
49+
可以舍弃左边部分了(start = mid + 1), 反之亦然。
50+
51+
我们以([6,7,8,1,2,3,4,5], 4)为例讲解一下:
52+
53+
![search-in-rotated-sorted-array-1](../assets/problems/search-in-rotated-sorted-array-1.jpg)
54+
55+
56+
![search-in-rotated-sorted-array-1](../assets/problems/search-in-rotated-sorted-array-2.jpg)
57+
58+
59+
## 关键点解析
60+
61+
- 二分法
62+
- 找出有序区间,然后根据target是否在有序区间舍弃一半元素
63+
## 代码
64+
65+
* 语言支持: Javascript
66+
67+
```js
68+
/*
69+
* @lc app=leetcode id=33 lang=javascript
70+
*
71+
* [33] Search in Rotated Sorted Array
72+
*/
73+
/**
74+
* @param {number[]} nums
75+
* @param {number} target
76+
* @return {number}
77+
*/
78+
var search = function(nums, target) {
79+
// 时间复杂度:O(logn)
80+
// 空间复杂度:O(1)
81+
// [6,7,8,1,2,3,4,5]
82+
let start = 0;
83+
let end = nums.length - 1;
84+
85+
while (start <= end) {
86+
const mid = start + ((end - start) >> 1);
87+
if (nums[mid] === target) return mid;
88+
89+
// [start, mid]有序
90+
91+
// ️⚠️注意这里的等号
92+
if (nums[mid] >= nums[start]) {
93+
//target 在 [start, mid] 之间
94+
95+
// 其实target不可能等于nums[mid], 但是为了对称,我还是加上了等号
96+
if (target >= nums[start] && target <= nums[mid]) {
97+
end = mid - 1;
98+
} else {
99+
//target 不在 [start, mid] 之间
100+
start = mid + 1;
101+
}
102+
} else {
103+
// [mid, end]有序
104+
105+
// target 在 [mid, end] 之间
106+
if (target >= nums[mid] && target <= nums[end]) {
107+
start = mid + 1;
108+
} else {
109+
// target 不在 [mid, end] 之间
110+
end = mid - 1;
111+
}
112+
}
113+
}
114+
115+
return -1;
116+
};
117+
```
118+
119+
## 扩展
120+
121+
122+

0 commit comments

Comments
 (0)