首页 > 编程语言 >代码随想录算法训练营第一天| LeetCode704 二分查找、27移除元素

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

时间:2023-12-13 20:02:05浏览次数:33  
标签:arr 27 int 元素 随想录 mid 数组 移除 指针

 Leetcode704:二分查找

今日学习的文章链接:

代码随想录 (programmercarl.com)

 

题目链接:

704. 二分查找 - 力扣(LeetCode)

●  自己看到题目的第一想法

这题我会,但是还没明白卡尔说的循环不变量是什么意思。

我的固定思路就是,target比中间值大,左指针右移到mid+1;target比中间值小,右指针左移到mid-1;

代码:

class Solution {
    public int search(int[] arr, int target) {
        //数组不重复才可以用二分法
        int i = 0;
        int j = arr.length - 1;
        int mid = 0;
        while (i <= j) {
            mid = (i + j) / 2;
            if (target > arr[mid]) {
                i = mid + 1;//左指针右移
            } else if (target < arr[mid]) {
                j = mid - 1;//右指针左移
            } else {
                return mid;
            }
        }
        return -1;
    }
}

 

●  看完代码随想录之后的想法

1.原来还有一种思路是不把右边界的值算进来,这样对于在左区间的元素,右指针移动到mid;对于右区间的元素,左指针移动到mid+1

2.循环不变量规则:区间的定义就是不变量,那么在循环中坚持根据查找区间的定义来做边界处理

3.在计算mid值得时候为了防止大整数的溢出可以把运算转成减法

修改后的代码如下

            mid = i + (j-i) >> 1;//减法不会溢出,而且就是说移位运算符效率高一些

 

●  自己实现过程中遇到哪些困难 

 溢出

●  今日收获,记录一下自己的学习时长

1h

 

 LeetCode27:移除元素

●  今日学习的文章链接

代码随想录 (programmercarl.com)

题目链接:

27. 移除元素 - 力扣(LeetCode)

●  自己看到题目的第一想法

感觉很简单,但是写的时候出现了bug,经过调试发现每次移动了元素之后,指针的位置要重置一下

class Solution {
    public int removeElement(int[] arr, int val) {
        int count = 0;
        for (int i = 0; i < arr.length-count; i++) {
            if (arr[i] == val) {
                for (int j = i; j < arr.length - 1-count; j++) {
                    arr[j] = arr[j + 1];//移动元素
                }
                count++;
                i--;
            }
        }
        return arr.length - count;
    }
}

 

●  看完代码随想录之后的想法 

这道题用两层循环其实会有一些冗余的操作,实际上如果只移动需要移动的元素就好了;利用快慢指针可以完成这样的思路。

快指针用来判断当前元素是否属于新数组,慢指针用来把当前元素加入到新数组;于是,当快指针指向的元素是需要删除元素的时候,快指针就会跳过这个元素,直到找到下一个需要被加入的元素,慢指针就会把这个元素加入到新数组中,所以慢指针代表的就是新数组所具有的所有元素。

可以发现,思考的时候反过来想会比较顺畅,也即考虑当前是否为新数组的元素,是的话就加入,不是的话就跳过。要从结果集的角度思考,不要从排除集的角度思考。

因为慢指针代表的就是我们要求的结果集,快指针就是用来排除结果集之外的元素的

class Solution {
    public int removeElement(int[] arr, int target) {
        int slow = 0;
        //快指针寻找新数组的元素
        //快指针找到了需要加入新数组的元素后,慢指针更新新数组的内容
        for (int fast = 0; fast < arr.length; fast++) {
            if (target != arr[fast]) {
                arr[slow] = arr[fast];
                slow++;//slow右移,该元素被加入到新数组当中
            }
            //如果快指针指向的元素是要删除的元素,那么快指针往后移动
            //慢指针不动,在下一轮的操作当中慢指针将会更新当前位置的值
        }
        //最后慢指针会停在新数组之外
        return slow;
    }
}

 

●  自己实现过程中遇到哪些困难 

快慢指针的思想很难一次想通,如果长时间不做很容易又忘记这个思路,需要反复练习

●  今日收获,记录一下自己的学习时长

1.5h

标签:arr,27,int,元素,随想录,mid,数组,移除,指针
From: https://www.cnblogs.com/xiaoni2023/p/17899228.html

相关文章

  • 算法学习Day1,二分查找,移除元素
    Day1二分查找,移除元素ByHQWQF2023/12/13笔记704.二分查找给定一个n个元素有序的(升序)整型数组nums和一个目标值target,写一个函数搜索nums中的target,如果目标值存在返回下标,否则返回-1。解法:使用二分查找来在一个有序的数组中找到指定元素的下标。根据数据边界......
  • P1527 [国家集训队] 矩阵乘法
    题意给定一个矩阵,每次询问子矩阵的第\(k\)大。Sol考虑把莫队扔到二维上来做。发现复杂度变为:\(O(n^2q^{\frac{3}{4}})\)。卡卡常就过了。Code#include<iostream>#include<algorithm>#include<cstdio>#include<array>#include<cmath>#include<vector>#i......
  • 【洛谷 P1271】【深基9.例1】选举学生会 题解(计数排序)
    【深基9.例1】选举学生会题目描述学校正在选举学生会成员,有名候选人,每名候选人编号分别从1到,现在收集到了张选票,每张选票都写了一个候选人编号。现在想把这些堆积如山的选票按照投票数字从小到大排序。输入格式输入和以及个选票上的数字。输出格式求出排序后的选票编......
  • 代码随想录算法训练营Day1 | 704.二分查找、27.移除元素
    LeetCode704.二分查找二分查找是一种基础的算法,其核心思想在高中数学中就已经被大家所熟知了,然而对于代码的实现,其细节问题常常令人头疼,比如while循环的条件是什么?middle是该+1还是-1?这些问题需要有一个清晰的认知。题目链接如下:704.二分查找Carl的讲解链接:二分查找算法......
  • 即时通讯技术文集(第27期):实时音视频技术合集(Part2) [共17篇]
    ​为了更好地分类阅读52im.net总计1000多篇精编文章,我将在每周三推送新的一期技术文集,本次是第27 期。[- 1 -] 专访微信视频技术负责人:微信实时视频聊天技术的演进[链接] http://www.52im.net/thread-1201-1-1.html[摘要] 本次专访是对谷沉沉老师在即将到来的2017Ar......
  • pydantic.errors.PydanticImportError,'pydantic:compiled' 在 Pydantic 版本 2 中已被
    今天编译python程序时pyinstaller-F--version-filefile_version_info.txtMelliferaCMD.py收到错误:58759INFO:Loadingmodulehook'hook-pydantic.py'from'D:\\env\\fbt\\Lib\\site-packages\\_pyinstaller_hooks_contrib\\hooks\\stdhooks'......
  • 解决 OSError: [WinError -1066598274] Windows Error 0xc06d007e (xjl456852原创)
    异常OSError:[WinError-1066598274]WindowsError0xc06d007e或Processfinishedwithexitcode-1066598274(0xC06D007E)遇到问题:程序在调用PCA方法时,出现上述异常.这种PCA方法使用sklearn中的依赖包.我尝试了pip和mamba重新安装多个依赖包之后问题得到解决(只选择一......
  • 「杂题乱刷」CF1272D
    题目链接CF1272DRemoveOneElement题意简述给定一个长度为\(n\)的序列,你需要求出至多删除一个数后的这个序列的最长上升子串。解题思路首先我们可以想一下这题的弱化版,给定一个长度为\(n\)的序列,你需要求出至多删除一个数后的这个序列的最长上升子序列。这题我们可以......
  • P2762 太空飞行计划问题
    题意有\(n\)个工作,每个工作需要一些限制。你可以花\(s_i\)的代价满足一个限制。然后获得\(h_i\)的贡献。问是的获得的贡献最大可以使多少?Sol最小割。从源点往每个实验连\(h_i\),每个实验往每个代价连\(inf\).代价往汇点连\(s_i\)就行了。Code#include<iostrea......
  • 27-进阶SQL-索引
    可以看到,上面的例子上,无索引的情况会查找全部的10次得到最终的结果,而有索引的情况会通过二叉排序树的数据结构,只需通过三次的查找就能得到最终的结果,更加的高效。(这里需要注意,上述二叉树索引结构只是一个示意图,并不是真实的索引结构) ......