704.二分查找
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
示例 1:
输入:nums = [-1,0,3,5,9,12],target = 9输出: 4
示例 2:
输入:nums = [-1,0,3,5,9,12],target = 2输出: -1
思路:两种写法:左闭右闭和左闭右开。先说第一种,我们定义 target 是在一个在左闭右闭的区间里,也就是[left, right] 。
区间的定义这就决定了二分法的代码应该如何写,因为定义target在[left, right]区间,所以有如下两点:
- while (left <= right) 要使用 <= ,因为left == right是有意义的,所以使用 <=
- if (nums[middle] > target) right 要赋值为 middle - 1,因为当前这个nums[middle]一定不是target,那么接下来要查找的左区间结束下标位置就是 middle - 1
代码如下:
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size() - 1;
while(left <= right){
int middle = left + (right - left) / 2;
if(nums[middle] > target){
right = middle - 1;
}
else if(nums[middle] < target){
left = middle + 1;
}
else{
return middle;
}
}
return -1;
}
};
左闭右开可以自己想一想怎么写。
27.移除元素
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。
假设 nums 中不等于 val 的元素数量为 k,要通过此题,您需要执行以下操作:
- 更改
nums数组,使nums的前k个元素包含不等于val的元素。nums的其余元素和nums的大小并不重要。 - 返回
k。
示例 1:
输入:nums = [3,2,2,3], val = 3 输出:2, nums = [2,2,_,_]
思路:第一种暴力解法,大致就是利用两个嵌套的for循环,外层for循环遍历数组,内层for循环查找等于val的元素,如果查找到就将val后面的数字依次往前移一位。代码如下:
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int size = nums.size();
for(int i = 0; i < size; i++){
if(nums[i] == val){
for(int j = i + 1; j < size; j++){
nums[j - 1] = nums[j];
}
size--;
i--;
}
}
return size;
}
};
第二种双指针法,定义快指针fast和慢指针slow。

代码如下:
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int slowIndex = 0;
for (int fastIndex = 0; fastIndex < nums.size(); fastIndex++) {
if (val != nums[fastIndex]) {
nums[slowIndex++] = nums[fastIndex];
}
}
return slowIndex;
}
};
977.有序数组的平方
给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
示例 1:
输入:nums = [-4,-1,0,3,10] 输出:[0,1,9,16,100] 解释:平方后,数组变为 [16,1,0,9,100] 排序后,数组变为 [0,1,9,16,100]
示例 2:
输入:nums = [-7,-3,2,3,11] 输出:[4,9,9,49,121]
思路:暴力解法就是将数组所有值平方后进行排序,代码就不展示了,自己写。
主要是使用更简单的双指针法。定义i指针指向数组头元素,j指针和k指针指向数组尾元素。如果i指针指向元素平方比j指向元素平方大,那么a[k] = a[i],i++,k--;如果j指针指向元素平方比i指向元素平方大,那么a[k] = a[j],j--,k--。一直循环这个过程直到i == j,最后再让新数组的头元素等于此时i指针指向元素平方即可(j也行)。代码如下:
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int i = 0;
int j = nums.size()-1;
int k = nums.size()-1;
vector<int> result(nums.size(), 0);
while(i != j){
if(nums[i] * nums[i] < nums[j] * nums[j]){
result[k] = nums[j] * nums[j];
k--;
j--;
}
else{
result[k] = nums[i] * nums[i];
k--;
i++;
}
}
result[0] = nums[i] * nums[i];
return result;
}
};
1086

被折叠的 条评论
为什么被折叠?



