首页 > 编程语言 >算法随想Day1【数组】| LC704-二分查找、LC27-移除元素

算法随想Day1【数组】| LC704-二分查找、LC27-移除元素

时间:2023-02-01 21:35:42浏览次数:38  
标签:right val LC27 nums int Day1 移除 size left

LC704. 二分查找

二分法编码时的难点,在于对数组边界问题的处理上。处理该问题的思想有两种,这两者的区别是基于数学里区间的概念去解释的。

对于区间,[1,1]的取值是合理的,而[1,1)是不合理的。

  • 左闭右闭写法:

​ 因为[1,1]是合理的,所以left是可以等于right的,而且在更新索引下标index时,对于左边界或右边界的更新,是不能包含上一轮比较中已经被包含的数据的。

////左闭右闭思想
int size = nums.size() - 1;
right = size;
while (left <= right)
{
	index = (left + right) >> 1;
	if (target == nums[index])
	{
		return index;
	}
	else if (nums[index] > target)
	{
        right = index - 1;
	}
	else
	{
        left = index + 1;
	}
}
  • 左闭右开写法:
////左闭右开思想
int size = nums.size();
right = size;
while (left < right)
{
    index = (left + right) >> 1;
    if (target == nums[index])
    {
        return index;
    }
    else if (nums[index] > target)
    {
        right = index - 1;
    }
    else
    {
        left = index + 1;
    }
}

LC27. 删除元素

想到了用双指针,但自己想问题太过复杂了,而且复杂的写法会导致很多特殊的情况没有考虑到,自感觉还是刷题比较少,继续加油。

注意点:
  • left第一次匹配val后,后面的非val值都要向左边移动。为了实现这点,在if (nums[left] != val)这个判断下,总是有nums[left] = nums[right]赋值。即使可能在还未匹配val之前有做无用赋值的工作,但保证了代码的通用性。

  • 开始使用 while (left < size)或者 while (right < size)做最外层的循环判断都不正确,前者可能会导致right向右移动越界,后者会导致left还没索引完vector全部元素,right就已经到达右边界了,从而可能导致val_count偏小的情况。最好的方法就是对数组索引做边界判断处理。

int removeElement(vector<int>& nums, int val)
{
    int left = 0, right = 0;
    int val_count = 0;
    int size = nums.size();
    while (right < size)
    {
        if (nums[right] == val)
        {
            val_count++;
        }

        if (nums[left] != val)
        {
            nums[left++] = nums[right++];
        }
        else
        {
            while (nums[right] == val)
            {
                right++;
                if (right >= size)	//超过边界的考虑
                {
                    right = size - 1;
                    break;
                }
                if (nums[right] == val)
                {
                    val_count++;
                }
            }
            nums[left++] = nums[right++];
        }

    }

    return size - val_count;
}

开始自己的写法还是有一些情况没有考虑到的,如下图所示:

但粗略写法的同时自己还是有所思考:

思考:凡是涉及到双指针的问题,都要考虑全两者的边界问题。尤其是与数组或者有界区域相关的内存下,做边界判断处理是最有效的方法。

官方双指针的思想是让双指针从两头各自出发,但这种解法下,我弄不太明白循环条件while (left < right)和while (left <= right)的差异以及其对返回值是return left或者是return left+1的影响

int removeElement(vector<int>& nums, int val) {
    int left = 0, right = nums.size();
    while (left < right) {
        if (nums[left] == val) {
            nums[left] = nums[right - 1];
            right--;
        } else {
            left++;
        }
    }
    return left;
}

最后参考Carl的快慢指针思想,自己再写一次:

//// 快指针用于获取新数组中的元素
//// 慢指针获取新数组中需要更新的位置
int removeElement(vector<int>& nums, int val)
{
    int slow = 0, fast = 0;
    int size = nums.size();
    for (fast = 0; fast < size; fast++)
    {
        if (nums[fast] != val)
        {
            nums[slow] = nums[fast];
            slow++;
        }
    }
    return slow;
}

标签:right,val,LC27,nums,int,Day1,移除,size,left
From: https://www.cnblogs.com/Mingzijiang/p/17084168.html

相关文章

  • C++ Day11 使用单例模式封装log4cpp
    一、实现log4cpp的封装,使其可以像printf一样使用,测试用例如下: 思路:使用可变模板参数,最终达到的效果是在使用 LogInfo、LogError、LogWarn、LogDebug时候可以传递任意类......
  • 代码随想录算法训练营day1
    代码随想录打卡day1今日学习内容(2月1日)阅读数组的基本理论学习二分查找并完成题目学习移除元素并完成题目总结学习到了二分法的两种情况(左闭右闭,左闭右开)......
  • 剑指offer——Day18 搜索与回溯算法(中等)
    Day182023.1.31搜索与回溯算法(中等)剑指offer55-Ⅰ.二叉树的深度自己实现这个题就是纯纯简单的DFS,当然用BFS也可以做,这里使用的是DFS代码如下:/***Definition......
  • 剑指offer——Day17 排序(中等)
    Day172023.2.1排序(中等)40.最小的k个数自己实现直接用了排序的函数,这个没啥好说的代码表现没有进行优化,中规中矩41.数据流中的中位数自己实现自己尝试用了最朴......
  • 代码随想录算法训练营第一天|704.二分查找、27.移除元素
    LeetCode704.二分查找(C++)题目链接:704.二分查找力扣leetCode二分查找算法思路:二分查找需要保证数组为有序数组同时无重复元素,否组无法通过二分查找进行判断(结果无法唯......
  • ptz2023题解/训练记录 #1 Petrozavodsk Winter Camp 2023 day1 JAGain in Petrozavods
    ProblemA.Agriculture签到题,没看,被队友切了ProblemB.BlocksandExpressions签到题,没看,被队友切了ProblemC.ChangingtheSequences首先,建图吧。然后,二分图最......
  • day17
    1、leetcode110平衡二叉树平衡二叉树:一个二叉树每个节点的左右两个子树的高度差的绝对值不超过1。递归法明确递归函数的参数和返回值参数:当前传入节点。返回值......
  • day15-声明式事务
    声明式事务1.事务分类编程式事务Connectionconnection=JdbcUtils.getConnection();try{//1.先设置事务不要提交connection.setAutoCommit(false);......
  • 《RPC实战与核心原理》学习笔记Day14
    19|分布式环境下如何快速定位问题?分布式环境下定位问题有什么难点?分布式环境下定位问题的难点在于,各子应用、子服务之间有复杂的依赖关系,我们有时很难确定是哪个服务......
  • 单词day1
    2023.1.30......