- 704.左闭右开
class Solution {
public:
int search(vector<int>& nums, int target) {
int ans = -1;
int left = 0, right = nums.size();//, mid = nums.size()/2;这里操作放入每次循环的开始时进行
while (left < right) {
int mid = (left + right)/2;
if (target == nums[mid])//是和nums[mid]比较而不是和mid比较
ans = mid;
if (target < nums[mid]) {
right = mid;
//mid = (left + right)/2;
}
else {
left = mid + 1;
//mid = (left + right)/2;
}
}
return ans;
}
};
- 27.解(1)
- O(n^2),与双层循环暴力解时间复杂度相同
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
// for (auto tmp : nums) {
// if ()
// }
int res = nums.size();
vector<int>::iterator it = nums.begin();//注意双冒号的位置
while (it != nums.end()) {
if (*it == val){
nums.erase(it);//删除迭代器处的值,也可以删除区间
res--;
}
else
it++;
}
return res;
}
};
-
解(2)
- 基本数据类型(如int)和它们对应的包装类型(如Integer)之间存在自动装箱和拆箱的机制。在代码中,int x 是一个基本数据类型,而 nums 是一个数组,数组中的元素类型是 int。在for-each循环中,发生了自动拆箱的过程,将数组中的 int 类型元素取出并赋值给 x。
- 比下面的双指针还要简短。
class Solution {
public int removeElement(int[] nums, int val) {
int idx = 0;
for (int x : nums) {
if (x != val) nums[idx++] = x;
}
return idx;
}
}
- 双指针
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int slowIndex = 0;
for (int quickIndex = 0; quickIndex < nums.size(); quickIndex++){
if (nums[quickIndex] != val){
nums[slowIndex++] = nums[quickIndex];
}
}
return slowIndex;
}
};