class Solution {
public:
int search(vector<int>& nums, int target) {
for(int i = 0; i<nums.size();i++){
if(nums[i] == target){
return i;
}
}
return -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)/2;
if(target<nums[middle]){
right = middle-1;
}else if(target>nums[middle]){
left = middle+1;
}else return middle;
}
return -1;
}
};
看网站代码查漏补缺:
int middle = left + ((right - left) / 2);// 防止溢出 等同于(left + right)/2
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size();
while(left < right){
int middle = left +(right-left)/2;
if(target>nums[middle]){
left = middle +1;
}else if (target<nums[middle]){
right = middle;
}else return middle;
}
return -1;
}
};
35.搜索插入位置
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
for(int i = 0 ; i<nums.size();i++){
if(nums[i]>=target){
return i;
}}
return nums.size();
}
};
二分法:
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int left = 0;
int right = nums.size()-1;
while(left <= right){
int middle = left+(right-left)/2;
if(target>nums[middle]){
left = middle +1;
}else if (target<nums[middle]){
right = middle-1;
}else return middle;
}
return right+1;
}
};
27.移除元素
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int length = nums.size();
for(int i =0 ; i <nums.size();i++){
if(nums[i] == val){
length--;
}
}
return length;
}
};
问题内数组是引用,return的是数组,返回的是nums[length],所以要进行val覆盖
双指针法
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;
}
};
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
vector<int> result = {-1,-1};
if(nums.size()==0) return result;
if(nums.size()==1&& nums[0] == target) return {0,0};
if(nums.size()==1) return {-1,-1};
int left = 0;
int right = 0;
for(int i = 0; i <nums.size()-1;i++){
if(nums[i] == target){
left = i;
break;
}else{
left = -1;
}}
for(int j = nums.size()-1; j>0; j--){
if(nums[j] != target){
right = -1;
break;
}else {right = j;
}}
return {left,right};
}
};
提交没通过问题不知道出在哪里。。
二分法确定左右边界:
while(left<=right){
int middle = left+((right-left)/2);
if(nums[middle]>target){
right = middle -1;
}else {
left = middle +1;//因为middle最后是查找的值,middle+1就是rightBorder
rightBorder =left;
}
while(left<=right){
int middle = left+((right-left)/2);
if(nums[middle]>=target){//用>= 当nums[middle] == target的时候确定左边界
right = middle-1;//因为middle最后是查找的值,middle-1就是leftBorder
leftBorder = right;
}else{
left = middle +1;
}