代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素

代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素

今日所做的内容为:
704二分查找https://leetcode.cn/problems/binary-search/submissions/
与27移除元素https://leetcode.cn/problems/remove-element/

二分查找

因为考研时做过一些二分查找的题目,所以对这道题的想法很简单,就是定义两个下标分别指向头和尾代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素_第1张图片

与此同时定义新的变量指向min与max的中间
mid = (min+max)/2

而此时若目标值target大于mid所指,即mid所指位置过小,因此重新定义min,也使mid重新定义
min = mid+1
mid = (min+max)/2
而此时若目标值target小于mid所指,即mid所指位置过过,因此重新定义max,也使mid重新定义
max = mid-1
mid = (min+max)/2
而对此循环,循环条件为:
nums[mid] != target && min <= max
即遍历的mid指针没有找到目标值并且min指针在max指针的右侧
最后则只需要判断mid所指是否使目标值
如果是,则返回mid,不然返回-1
代码如下:

  • class Solution { public:
    int search(vector& nums, int target)
    {
    int min = 0;
    int max = size(nums)-1;
    int mid = (min + max) / 2;
    while (nums[mid] != target && min <= max)
    {
    if (nums[mid] > target)
    max = mid - 1;
    else
    min = mid + 1;
    mid = (min + max) / 2;
    }
    if (nums[mid] != target)
    return -1;
    return mid;
    } };

移除元素

移除元素也是考研学过的基础内容
利用暴力算法与双指针均可计算,双指针明显比暴力算法更简便,因此此处只介绍双指针算法
代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素_第2张图片
起初两个指针low与fast均指向第一个元素
当fast指针不等于目标值target
则使nums【low】 = nums【fast】且让low与fast均后移
即 nums【low++] = nums[fast++]
(本人的代码是for循环,因此不用fast++,嘿嘿)
让它们都指向下一个元素;

当fast指针等于目标值target
则只需要让fast指针向后移动即可

直至fast指针遍历完全部元素
代码如下:
class Solution {
public:
int removeElement(vector& nums, int val) {
int k = size(nums);
int ii = 0;
for (int u = 0;u {
if(nums[u]!=val)
nums[ii++]=nums[u];
}
return ii;
}
};

由于这是笔者第一次写力扣也是第一次写博客,内容会过于简陋,望见谅

你可能感兴趣的:(算法,leetcode,数据结构)