力扣35:搜索插入位置
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int i = 0;
int len = nums.size() ;
//首先排除数组第一个元素 和 最后一个元素的可能位置
if(target < nums[0]) return 0;
if(target > nums[len - 1]) return len;
//遍历
while(target >= nums[i] && i < len)
{
//当前nums[i] 等于 target,跳出循环,不再进行i累加1
if(target == nums[i])
{
break;
}
i ++;
}
return i;
}
};
时间复杂度: O ( n ) O(n) O(n)
二分法
官方解答
n
u
m
s
[
p
o
s
−
1
]
<
t
a
r
g
e
t
<
=
n
u
m
s
(
p
o
s
)
nums[pos - 1] < target <= nums(pos)
nums[pos−1]<target<=nums(pos)
关键:在一个有序数组中找到第一个大于等于target的下标
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int n = nums.size();
int left = 0, right = n - 1, ans = n;
while (left <= right)
{
int mid = ((right - left) >> 1) + left; //二分法
if (target > nums[mid])
{
left = mid + 1;
}
else
{
right = mid - 1;
}
}
return left;
}
};
时间复杂度: O ( l o g n ) O(logn) O(logn)
力扣88:合并两个有序数组
双指针法
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int p1 = 0, p2 = 0;
int sorted[m+n];
int cur;
while(p1 < m || p2 <n)
{
if(p1 == m)
{
cur = num2[p2++];
}
else if(p2 == n)
{
cur = nums[p1++];
}
else if(nums1[p1] < nums[p2])
{
cur = nums[p1++];
}
else{
cur = nums2[p2++];
}
sorted[p1 + p2 - 1] = cur;
}
for(int i = 0; i != m+n ; i++)
{
nums[i] = sorted[i];
}
}
};
逆向双指针法
nums1数组的后半部分是空的,可以直接覆盖而不会影响结果。因此可以指针设置为从后向前遍历,每次取两者中的较大者放进num1的最后面。
严格来说,在此遍历过程的任何一个时刻,nums1数组中有
m
−
p
1
−
1
m-p1-1
m−p1−1个元素被放入nums1的后半部,nums2数组中有
n
−
p
2
−
1
n-p2-1
n−p2−1个元素被放入nums1的后半部分,而在指针p1的后面,nums1数组有m+n-p1-1个空闲位置,由于
m
+
n
−
p
1
−
1
>
=
m
−
p
1
−
1
+
n
−
p
2
−
1
m+n-p1-1>= m-p1-1 + n-p2 -1
m+n−p1−1>=m−p1−1+n−p2−1
等价于
p
2
>
=
−
1
p2 >= -1
p2>=−1
永远成立,因此p1后面的位置永远足够容纳被插入的元素,不会产生p1的元素被覆盖的情况。
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int p1 = m - 1, p2 = n - 1;
int tail = m + n - 1;
int cur;
while (p1 >= 0 || p2 >= 0) {
if (p1 == -1) {
cur = nums2[p2--];
} else if (p2 == -1) {
cur = nums1[p1--];
} else if (nums1[p1] > nums2[p2]) {
cur = nums1[p1--];
} else {
cur = nums2[p2--];
}
nums1[tail--] = cur;
}
}
};