今天的代码比较简单,时间紧迫我现在不打算写多少内容。
@程序员Carl
数组的元素是不能删的,只能覆盖。
LeetCode 704 二分查找
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;
}
if(target>nums[middle]){
left = middle+1;
}
if(nums[middle]==target)
return middle;
}
return -1;
}
};
LeetCode 27 移除元素(双指针法一)
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int slowindex=0;
for(int fastindex=0;fastindex<nums.size();fastindex++){
if(nums[fastindex]!=val){
nums[slowindex++]=nums[fastindex];
}
}
return slowindex;
}
};
移除元素还有两种方法还没带掌握,明天看看:
1.暴力解法
// 时间复杂度:O(n^2) // 空间复杂度:O(1) 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]; } i--; // 因为下标i以后的数值都向前移动了一位,所以i也向前移动一位 size--; // 此时数组的大小-1 } } return size; } };
2. 双指针法二
/** * 相向双指针方法,基于元素顺序可以改变的题目描述改变了元素相对位置,确保了移动最少元素 * 时间复杂度:O(n) * 空间复杂度:O(1) */ class Solution { public: int removeElement(vector<int>& nums, int val) { int leftIndex = 0; int rightIndex = nums.size() - 1; while (leftIndex <= rightIndex) { // 找左边等于val的元素 while (leftIndex <= rightIndex && nums[leftIndex] != val){ ++leftIndex; } // 找右边不等于val的元素 while (leftIndex <= rightIndex && nums[rightIndex] == val) { -- rightIndex; } // 将右边不等于val的元素覆盖左边等于val的元素 if (leftIndex < rightIndex) { nums[leftIndex++] = nums[rightIndex--]; } } return leftIndex; // leftIndex一定指向了最终数组末尾的下一个元素 } };
总结:今天金工实习,所以写的时间比较零散,下次还是用整块的时间来写好