代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素(C语言)
Leetcode :704.二分查找
题目链接: 704. 二分查找
思路:
将目标区间的中间点向右取整,而不是向下取整。这样做可以减少代码逻辑上的判断,使得代码更加简洁。同时,在比较候选值与目标值的大小时,我们使用了小于等于号(<=)而非严格的小于号(<)。这是因为如果目标值存在,那么它可能出现在目标区间的最后一个位置,此时需要将找到的第一个大于目标值的元素的下标往回调整一位。最后,根据最后确定的左边界,我们可以判断目标值是否存在。
程序代码如下:
int search(int* nums, int numsSize, int target){
int left = 0, right = numsSize - 1;
while (left < right) {
int mid = (left + right + 1) / 2;
if (nums[mid] <= target) {
left = mid;
} else {
right = mid - 1;
}
}
if (nums[left] == target) {
return left;
} else {
return -1;
}
}
时间复杂度和空间复杂度:
在最坏情况下需要进行 O(log n) 次比较,其中 n 是数组的长度。与之前的算法类似,每次比较都可以将目标区间缩小一半,因此时间复杂度为 O(log n)。同样地,该算法也不需要使用额外的数据结构,因此空间复杂度为 O(1)。
算法流程示意图:
================================================================================================
Leetcode :27.元素转移
题目链接: 27. 元素转移
思路:
程序代码如下:
int removeElement(int* nums, int numsSize, int val){
int i = 0;
for (int j = 0; j < numsSize; j++) {
if (nums[j] != val) {
nums[i] = nums[j];
i++;
}
}
return i;
}
示例 1:
输入:nums = [3,2,2,3], val = 3
输出:2, nums = [2,2]
解释:函数应该返回新的长度 2,并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。
示例 2:
输入:nums = [0,1,2,2,3,0,4,2], val = 2
输出:5, nums = [0,1,3,0,4]
解释:函数应该返回新的长度 5,并且 nums 中的前五个元素为零、一、三、零、四。注意这五个元素可为任意顺序。你不需要考虑数组中超出新长度后面的元素。
时间复杂度和空间复杂度:
在最坏情况下需要进行 O(log n) 次比较,其中 n 是数组的长度。与之前的算法类似,每次比较都可以将目标区间缩小一半,因此时间复杂度为 O(log n)。同样地,该算法也不需要使用额外的数据结构,因此空间复杂度为 O(1)。