数组
LeetCode 704 二分查找 2023.10.25
- LeetCode 704 二分查找[题目链接]
- 代码随想录讲解[链接]
- 提供无重复递增或递减排序,用于搜索某一条件值
- 方法:二分查找将有序数组查找范围每次压缩一半,变动两端index
- 关键:把所有元素都考虑在内!不要漏!(左闭右闭、左闭右开)
- 扩展:也可用于除法求平方根
int search(vector<int>& nums, int target) {
int end = nums.size();
for (int i = 0; i < end; ) //左闭右开
{
int mid = i + (end - i)/2;
if(nums[i] == target)
{
return i;
}
if(nums[mid] == target)
return mid;
else if(nums[mid] < target)
{
i = ++mid;
}
else //nums[mid] > target
{
end = mid;
i++;
}
}
return -1;
}
- 时间复杂度O(log n);空间复杂度O(1)
LeetCode 27 移除元素 2023.10.25
- LeetCode 27 移除元素[题目链接]
- 代码随想录讲解[链接]
- 方法一:暴力搜索,然后将元素前移
- 方法二:快慢指针,用快指针找到所查元素后,慢指针不动,continue;因此所查元素会被覆盖
- 两个指针可以在一侧依次增加;也可以在异侧一个加,一个减
int removeElement(vector<int>& nums, int val) {
int size = nums.size();
int sym = 0;
sort(nums.begin(), nums.end());//本题中要求可以变换顺序
//以下做法是第一次自己所做时所想,时间复杂度为O(2n)=O(n)
for (int i = 0; i < size; i++)
{
if (nums[i] == val)
{
sym ++;
}
else if (nums[i] != val && sym != 0)
{
for (int j = 0; j < size-i; j++)
{
//if(i+j < size)
nums[i - sym + j] = nums[i+j];
}
return size - sym;
}
}
return size - sym;
}
- 时间复杂度O(n) 空间复杂度O(1)