704.
给定一个 n
个元素有序的(升序)整型数组 nums
和一个目标值 target
,写一个函数搜索 nums
中的 target
,如果目标值存在返回下标,否则返回 -1
。
方法一:无脑解法(我能直接想到的方法)
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0, right = nums.size()-1;
for(int i = left; i <= right ; i ++){
if(nums[i]==target){
return i;
}
}
return -1;
}
};
方法二:有脑解法(二分法)
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0, right = nums.size()-1;
while(left<=right){
int mid = (right - left)/2+left;//避免溢出
if(nums[mid]==target){ //刚好找到
return mid;
}else if(nums[mid]>target){//目标比中间值小
right = mid -1;
}else{ //目标比中间值大
left = mid + 1;
}
}
return -1;
}
};
27.移除元素
给你一个数组 nums
和一个值 val
,你需要 原地 移除所有数值等于 val
的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1)
额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
方法一:无脑解法
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int len = nums.size();
int index = 0;
for(int i = 0 ; i < len; i ++){
if(nums[i]!=val){
nums[index] = nums[i];
index++;
}else{
}
}
return index;
}
};
方法二:有脑解法(双指针优化)
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int R = nums.size()-1;
int L= 0;
while(L<=R){
if(nums[L]==val){
nums[L] = nums[R]; //将尾值填充
R--; //右指针前移
}else{
L++; //左指针后移
}
}
return L;
}
};