目录
leetcode704.二分查找
题目
给定一个 n
个元素有序的(升序)整型数组 nums
和一个目标值 target
,写一个函数搜索 nums
中的 target
,如果目标值存在返回下标,否则返回 -1
。
示例 1:
输入:nums= [-1,0,3,5,9,12],
target = 9
输出: 4 解释: 9 出现在 nums中并且下标为 4
示例 2:
输入:nums = [-1,0,3,5,9,12],
target = 2
输出: -1 解释: 2 不存在 nums 中因此返回 -1
提示:
- 你可以假设
nums
中的所有元素是不重复的。 n
将在[1, 10000]
之间。nums
的每个元素都将在[-9999, 9999]
之间。
解题思路
算法:二分法
因为题目所给数组为有序数组,所以本题可使用二分法来解决。
初始化两个指针 begin 和 end,分别指向数组的起始位置和结束位置。使用一个 while 循环,当 begin 小于等于 end 时,继续查找。计算中间位置 mid,即 (begin + end) / 2。如果目标值 target 小于 nums[mid],说明目标值在数组的左半部分,因此将 end 更新为 mid - 1。如果目标值 target 大于 nums[mid],说明目标值在数组的右半部分,因此将 begin 更新为 mid + 1。如果目标值 target 等于 nums[mid],说明找到了目标值,返回 mid 作为结果。如果循环结束后仍未找到目标值,说明目标值不在数组中,返回 -1。
代码实现
int search(int* nums, int numsSize, int target) {
int begin = 0;
int end = numsSize - 1;
while (begin <= end) {
int mid = (begin + end) / 2;
if (target < nums[mid]) {
end = mid - 1;
} else if (target > nums[mid]) {
begin = mid + 1;
} else {
return mid;
}
}
return -1;
}
leetcode283.移动零
题目
给定一个数组 nums
,编写一个函数将所有 0
移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
示例 1:
输入: nums = [0,1,0,3,12] 输出: [1,3,12,0,0]
示例 2:
输入: nums = [0] 输出: [0]
提示:
1 <= nums.length <= 104
-231 <= nums[i] <= 231 - 1
解题思路
算法:双指针
首先,检查数组的大小是否为0,如果是,则直接返回,因为一个空数组没有元素需要移动。然后定义两个指针i和j,分别用于遍历数组和记录非零元素的位置。初始时,j的值为0。使用for循环遍历数组。在循环中,检查当前元素nums[i]是否为非零元素。如果是非零元素,我们将其与j位置的元素进行交换,然后将j的值加1。这样,我们可以确保j位置之前的所有元素都是非零元素,而j位置之后的所有元素都是0。当遍历完整个数组后,所有的非零元素都已经按照相对顺序排列在数组的前部分,所有的0都排列在数组的后部分。
代码实现
void moveZeroes(int* nums, int numsSize) {
if (numsSize == 0)
return;
int i, j = 0;
for (i = 0; i < numsSize; i++) {
if (nums[i] != 0) {
int n = nums[j];
nums[j] = nums[i];
nums[i] = n;
j++;
}
}
return;
}