代码随想录第一天|数组part01

  1. 二分查找
    题目建议: 大家今天能把 704.二分查找 彻底掌握就可以,至于 35.搜索插入位置 和 34. 在排序数组中查找元素的第一个和最后一个位置 ,如果有时间就去看一下,没时间可以先不看,二刷的时候在看。
    先把 704写熟练,要熟悉 根据 左闭右开,左闭右闭 两种区间规则 写出来的二分法。
    题目链接:https://leetcode.cn/problems/binary-search/
    文章讲解:https://programmercarl.com/0704.二分查找.html
    视频讲解:https://www.bilibili.com/video/BV1fA4y1o715

题目感想:
1.首先要知道左闭右闭还是左闭右开,然后就是搞清楚边界更新是怎么的,就是不会是最终结果的放在范围外(取不到值),比如:
1)左闭右闭,判断之后middle是肯定取不到的,那么更新后的边界不能是middle,大于middle则,left=middle+1;小于middle则,right=middle-1;
2)左闭右开,判断之后middle是肯定取不到的,那么更新后的范围也要保证middle取不到,大于middle则,left=middle+1;小于middle则,right=middle(右边是开区间,所以此时的middle是取不到的
3)左闭右闭 a〈=b
4)左闭右开a 〈b

2.注意对输入的值进行校验

 // 避免当 target 小于nums[0] nums[nums.length - 1]时多次循环运算
        if (target < nums[0] || target > nums[nums.length - 1]) {
            return -1;
        }

  1. 移除元素
    题目建议: 暴力的解法,可以锻炼一下我们的代码实现能力,建议先把暴力写法写一遍。 双指针法 是本题的精髓,今日需要掌握,至于拓展题目可以先不看。
    题目链接:https://leetcode.cn/problems/remove-element/
    文章讲解:https://programmercarl.com/0027.移除元素.html
    视频讲解:https://www.bilibili.com/video/BV12A4y1Z7LP

题目感想:
1.暴力法
思路就是直接遍历数组,遍历到要去除的数字时,就进入一个循环,将后面的数字全部向前移动一位,在退出这个循环之前要将遍历用的索引-1,因为此时的索引指向的已经是个新元素了,不-1将会漏掉这个元素的判断,同时数组长度-1;
2.双指针法
快慢指针法:
首先不要被快慢这个词误导,其实可以这么理解,一个是一直会移动的指针,一个是可能会在某个索引停下来的指针,整个过程可以理解为原地创建一个新的数组,会移动的指针会去寻找可以加入新数组的元素(非目标排除数字以外的数字),会停的指针会指向新数组的索引,当被之乡的地方加入了元素之后,会停的数组会移到下一个索引位;
双向指针法:
主要的思想是右边的非目标排除数去覆盖左边的目标排除数,覆盖后左边+1,右边继续向左移动至非目标排除数,左移代码:

while(right >= 0 && nums[right] == val) right--;

977.有序数组的平方

题目建议: 本题关键在于理解双指针思想

题目链接:https://leetcode.cn/problems/squares-of-a-sorted-array/
文章讲解:https://programmercarl.com/0977.有序数组的平方.html
视频讲解: https://www.bilibili.com/video/BV1QB4y1D7ep

题目感想:
首先数组本来就是有序的,经过平方后,最大的数字总是在数组的最两边上,我们只要比较最边上的数字的平方后的大小,然后选择最大的加入新数组即可

int l = 0;
        int r = nums.length - 1;
        int[] res = new int[nums.length];
        int j = nums.length - 1;
        while(l <= r){
            if(nums[l] * nums[l] > nums[r] * nums[r]){
                res[j--] = nums[l] * nums[l++];
            }else{
                res[j--] = nums[r] * nums[r--];
            }
        }

总结:
1.看题目时要有敏锐性,看看能不能双指针,实在不行再试试暴力,暴力之后看看还能怎么优化;
2.学习时忘记记录时间了,下次开始学习时一定记录时间;
3.md文档还是不够熟练,有很多格式没调好,还在学习中;

作者:Yingc

出处:https://www.cnblogs.com/yingcn/p/18741056

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

怕什么真理无穷,进一寸有一寸的欢喜 ———— 胡适

posted @   颍川凛子  阅读(273)  评论(2编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
点击右上角即可分享
微信分享提示