leetcode 704 二分查找
题目:https://leetcode.cn/problems/binary-search/description/
思想:通过对有序数组的二分查找可以减少时间复杂度,左边小了向右移,右边大了向左移。主要困难在于边界控制,即while循环中是否需要加上等号,还有最初的left和right边界是否需要加一减一。
class Solution {
public:
int search(vector<int>& nums, int target)
{
// if(nums.size() == 1 && nums[0]!=target)
// return -1;
int left = 0,right = nums.size()-1;
int mid = 0;
while(left <= right)
{
mid = (left + right)/2;
if(nums[mid] > target)
{
right = mid - 1;
}
else if(nums[mid] < target)
{
left = mid + 1;
}
else if(nums[mid] == target)
{
return mid;
}
}
cout << mid;
return -1;
}
};
leetcode 27 移除元素
题目链接:https://leetcode.cn/problems/remove-element/description/
思想:数组内元素顺序可以随意,这就比较好办,直接把目标元素移动到末尾,同时记录元素个数,最后返回元素个数值即可。关键在于用一个tail变量记录尾部有多少个需去除元素,然后从前往后遍历数组,使目标元素移到最后,同时返回值即总个数减去目标元素个数。
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int tail = 0;//记录尾部有多少个去除元素
for(int i = 0; i<nums.size()-tail; i++)
{
if(nums[i] == val)
{
for(int j = nums.size()-tail-1 ; j >= i ; j--)
{
if(nums[j] != val)
{
swap(nums[i],nums[j]);
break;
}
tail++;
}
}
}
return nums.size()-tail;
}
};