Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit eeac47f

Browse files
committed
Create 35.搜索插入位置(简单).md
1 parent 7de953b commit eeac47f

File tree

1 file changed

+65
-0
lines changed

1 file changed

+65
-0
lines changed
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
```text
2+
题目: 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引;
3+
如果目标值不存在于数组中,返回它将会被按顺序插入的位置;
4+
示例1:
5+
输入: [1,3,5,6], 5
6+
输出: 2
7+
示例2:
8+
输入: [1,3,5,6], 2
9+
输出: 1
10+
示例 3:
11+
输入: [1,3,5,6], 7
12+
输出: 4
13+
示例 4:
14+
输入: [1,3,5,6], 0
15+
输出: 0
16+
1.一次遍历:
17+
[1]思路: 有序数组可通过一次遍历与目标值比较确定下标
18+
[2]实现:
19+
class Solution {
20+
public int searchInsert(int[] nums, int target) {
21+
for (int i = 0; i < nums.length; i++) {
22+
if (nums[i] >= target) {
23+
return i;
24+
}
25+
}
26+
return nums.length;
27+
}
28+
}
29+
[3]复杂度分析:
30+
(1)时间复杂度: O(N),N为数组的长度
31+
(2)空间复杂度: O(1)
32+
2.二分法:
33+
[1]思路:
34+
(1)二分法是用来查询有序数组中是否含有指定元素
35+
(2)由于不存在时要返回插入的位置,则有两种情况:
36+
1)二分后的中间值等于目标值,此时返回中间值下标
37+
2)二分后,目标值处在左区间或右区间则保存区间的右边界值的下标,
38+
循环往复直到不满足循环条件,最后保存的右边界值下标即插入位置
39+
[2]实现:
40+
class Solution {
41+
public int searchInsert(int[] nums, int target) {
42+
int n = nums.length;
43+
// 定义数组左右边界指针和不存在时插入的位置变量
44+
int left = 0, right = n - 1, ans = n;
45+
// 二分法查找
46+
while (left <= right) {
47+
int mid = (right + left)/2;
48+
if(target == nums[mid]){
49+
return mid;
50+
}
51+
if (target < nums[mid]) {
52+
// 一旦目标值所在区间的右边界缩小时,需要更新插入的位置
53+
ans = mid;
54+
right = mid - 1;
55+
} else {
56+
left = mid + 1;
57+
}
58+
}
59+
return ans;
60+
}
61+
}
62+
[3]复杂度分析:
63+
(1)时间复杂度: O(lgN),N为数组的长度
64+
(2)空间复杂度: O(1),常数个变量不影响
65+
```

0 commit comments

Comments
 (0)