代码随想录算法训练营第一天

2023-11-04

 数组理论基础  

文章链接:代码随想录

记忆:

        数组是存放在连续内存空间上的相同类型数据的集合。

  • 数组下标都是从0开始的。
  • 数组内存空间的地址是连续的
  • 数组的元素是不能删的,只能覆盖。
  • 在C++中二维数组是连续分布的。
  • 像Java是没有指针的,同时也不对程序员暴露其元素的地址,寻址操作完全交给虚拟机。二维数组的每一行头结点的地址是没有规则的,更谈不上连续。

  • 所以Java的二维数组可能是如下排列的方式:

  • 算法通关数组3

 704. 二分查找 

题目建议: 大家能把 704 掌握就可以,35.搜索插入位置 和 34. 在排序数组中查找元素的第一个和最后一个位置 ,如果有时间就去看一下,没时间可以先不看,二刷的时候在看。

先把 704写熟练,要熟悉 根据 左闭右开,左闭右闭 两种区间规则 写出来的二分法

题目链接:

704. 二分查找

文章讲解:代码随想录

记忆:

        第一种写法,我们定义 target 是在一个在左闭右闭的区间里,也就是[left, right] (这个很重要非常重要)

        区间的定义这就决定了二分法的代码应该如何写,因为定义target在[left, right]区间,所以有如下两点:

  • while (left <= right) 要使用 <= ,因为left == right是有意义的,所以使用 <=
  • if (nums[middle] > target) right 要赋值为 middle - 1,因为当前这个nums[middle]一定不是target,那么接下来要查找的左区间结束下标位置就是 middle - 1
public int search(int[] nums, int target) {
        int i =0;
        int j= nums.length-1;
        
        while(i<=j){//左闭右闭,会有相遇的情况
            int mid = j+(i-j)/2;//防溢出
            if(nums[mid]<target){
                i = mid+1;//已经确定不会等于mid
            }
            if(nums[mid]>target){
                j = mid-1;//已经确定不会等于mid
            }
            if(nums[mid]==target){
                return mid;
            }
        }
    
    return -1;
    }

时间复杂度:O(log n)
空间复杂度:O(1)

拓展:

35.搜索插入位置

  • 文章讲解:35.搜索插入位置

  • 力扣题目链接
  • public int searchInsert(int[] nums, int target) {
            int i =0;
            int j= nums.length-1;
            while(i<=j){
                int mid = i+(j-i)/2;
                if(nums[mid]<target){
                    i = mid+1;
                }
                if(nums[mid]>target){
                    j = mid-1;
                }
                if(nums[mid]==target){
                    return mid;
                }
            }
        return i;//或者j+1
        }
    // 分别处理如下四种情况
    // 目标值在数组所有元素之前  [0, -1]
    // 目标值等于数组中某一个元素  return middle;
    // 目标值插入数组中的位置 [left, right],return  right + 1
    // 目标值在数组所有元素之后的情况 [left, right], 因为是右闭区间,所以 return right + 1
    时间复杂度:O(log n)
    空间复杂度:O(1)

 34.在排序数组中查找元素的第一个和最后一个位置

public int[] searchRange(int[] nums, int target) {
        int i =0;
        int j= nums.length-1;
        while(i<=j){
            int mid = j+(i-j)/2;
            if(nums[mid]<target){
                i = mid+1;
            }
            if(nums[mid]>target){
                j = mid-1;
            }
            if(nums[mid]==target){
                int l=mid,r=mid;//从中间向两边扩展
                while( l-1 >= 0 && nums[l--]==target ){//数组限制,防止溢出
                    if(nums[l]!=target){
                        l++;
                        break;
                    }
                }
                while(r+1 <= nums.length-1 && nums[r++]==target){
                    if(nums[r]!=target){
                        r--;
                        break;
                    }
                }
                return new int[]{l,r};//数组创建方式
            }
        }
    
    return new int[]{-1,-1};
    }
时间复杂度:O(log n)
空间复杂度:O(1)

 69.x 的平方根


69.x 的平方根

public int mySqrt(int x) {
        if(x==0 || x==1){
            return x;
        }
        int i =1;
        int j= x/2;//由于题目的特殊性可以这样设置
        while(i<j){//左闭右开
            int mid = i+(j-i+1)/2;//偏右
            if(mid > x/mid){
                j = mid-1;
            }else if(mid < x/mid){//由于题目的特殊性可以这样设置
                i = mid;
            }else{
                return mid;
            }
        }
    return i;
}
时间复杂度:O(log n)
空间复杂度:O(1)

367.有效的完全平方数

367.有效的完全平方数

public boolean isPerfectSquare(int num) {
            if( num==1){
            return true;
        }
        int i =0;
        int j= num;
        while(i<=j){
            int mid = i+(j-i)/2;
            if(mid > num/mid){
                j = mid-1;
            }else if(mid < num/mid){
                i = mid+1;
            }else{
                return true;
            }
        }
    return false;
    }
时间复杂度:O(log n)
空间复杂度:O(1)
//完全二分法

27. 移除元素

题目建议:  暴力的解法,可以锻炼一下我们的代码实现能力,建议先把暴力写法写一遍。 双指针法 是本题的精髓,今日需要掌握,至于拓展题目可以先不看。 

题目链接:力扣

文章讲解:代码随想录

视频讲解:数组中移除元素并不容易! | LeetCode:27. 移除元素_哔哩哔哩_bilibili

    public int removeElement(int[] nums, int val) {
            int slowIndex = 0;
            for(int fastIndex =0;fastIndex < nums.length; fastIndex++ ){
                if(val != nums[fastIndex]){
                    nums[slowIndex++] = nums[fastIndex];
                    }
            }
        return slowIndex;
时间复杂度:O(n)
空间复杂度:O(1)

26.删除排序数组中的重复项

26.删除排序数组中的重复项

public int removeDuplicates(int[] nums) {
         int n = nums.length;
        int j = 0;
        for (int i = 0; i < n; i++) {
            if (nums[i] != nums[j]) {
                nums[++j] = nums[i];
            }
        }
        return j+1;
    }
时间复杂度:O(n)
空间复杂度:O(1)

283.移动零

283.移动零

public void moveZeroes(int[] nums) {
        int slowIndex = 0;
        for(int fastIndex = 0; fastIndex<nums.length;fastIndex++){
            if(nums[fastIndex]!= 0){
                
                nums[slowIndex++]=nums[fastIndex];
            }
        }
        for(int i = slowIndex; i<nums.length;i++){
            
            nums[i]=0;
        }

    }
时间复杂度:O(n)
空间复杂度:O(1)

844.比较含退格的字符串

844.比较含退格的字符串

public boolean backspaceCompare(String s, String t) {
        return convert(s).equals(convert(t));
    }

    private String convert(String s1) {
        StringBuilder s = new StringBuilder();
        char[] sc = s1.toCharArray();
        int j=0;
        for(int i =sc.length-1; i>=0 ;i-- ){
            if(sc[i]=='#'){
                j++;
            }else if(j==0){
                s.append(sc[i]);
            }else if(sc[i]!='#'){
                j--;
            }
        }
        return s.toString();
    }
时间复杂度:O(n)
空间复杂度:O(1)

977.有序数组的平方

977.有序数组的平方

public int[] sortedSquares(int[] nums) {
        int[] newnums = new int[nums.length];
        for(int i=0,j=nums.length-1,k=nums.length-1;i<=j; k--){
            int m = nums[i]*nums[i];
            int n = nums[j]*nums[j];
            if(m>n){
                newnums[k] = m;
                i++;
            }else{
                newnums[k] = n;
                j--;
            }
        }
        return newnums;
    }

//时间复杂度为O(n)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

代码随想录算法训练营第一天 的相关文章

  • 两条线段是否相交原理及C++实现

    step 1 快速排斥 如上图1 2所示 AB的最大X坐标 如果小于PQ的最小X坐标 则不相交 CD和UV判断同理 换成 坐标即可 step 2 利用向量叉乘判断 亦称跨立方法 2D 叉乘可把 2D 点看作 3D 的点 z 轴的值为 0 套

随机推荐

  • Spring 如何使用注解实现事务管理呢?

    转自 Spring 如何使用注解实现事务管理呢 下文讲述Spring使用注解使用事务管理的方法分享 实现思路 使用 Annotation 需进行以下设置 1 在 Spring 容器中注册驱动
  • 正交矩阵

    正交矩阵是实数特殊化的酉矩阵 因此总是正规矩阵 尽管我们在这里只考虑实数矩阵 这个定义可用于其元素来自任何域的矩阵 正交矩阵毕竟是从内积自然引出的 对于复数的矩阵这导致了归一要求 定义 定义 1 如果 AA E E为单位矩阵 A 表示 矩阵
  • switch-case流程图

    第一种情况 每一个case后面都有break switch p case 1 process 1 break case 2 process 2 break case n process n break default process n 1
  • 02-蘑菇街爬虫mw-sign参数破解

    02 蘑菇街爬虫mw sign参数破解 目录 01 蘑菇街爬虫准备工作1 02 蘑菇街爬虫mw sign参数破解 03 蘑菇街爬虫概述 04 蘑菇街爬虫 店铺搜索页面 mw sign参数分析 经过网友断点测试 我们发现mw sign是经过两
  • 运维重点小知识点总结

    1 可以使用lsblk命令树形方式显示所有可用块设备情况 lsblk NAME MAJ MIN rm SIZE RO type mountpoint sda 8 0 0 232 9G 0 disk sda1 8 1 0 46 6G 0 pa
  • 使用Python批量提取TRMM降水数据均值

    今天给大家分享一个数据平均值的吧 好像从来没有分享过这个内容 以问题为导向利用Python帮助我们解决在科研中遇到的问题 最近有同学在处理TRMM降水数据的时候 说是要提取每个月的均 值出来 数据格式是tif栅格 目的也是非常明确的 提取多
  • Linux文件管理(文件/目录的创建、更改、删除)

    一 Linux文件命名规则 1 严格区分大小写 2 文件命名不能使用字符 3 目录或文件名的长度不能超过255个字符 建议 1 文件名由两个或两个以上单词组成时 尽量使用 来代替space键 2 尽量不用字母的大小写来区分文件或者目录 4
  • curl

    什么是curl命令 curl是利用URL语法在命令行方式下工作的开源文件传输工具 它被广泛应用在Unix 多种Linux发行版中 并且有DOS和Win32 Win64下的移植版本 如何在windows下使用curl命令 第一步 进入curl
  • 在 AIX 5.3 和 6.1 中使用 Veritas Volume Manager (VxVM) V5 管理逻辑卷

    引言 在 UNIX 存储管理市场上 有两家主要的领先厂商 IBM 和 Veritas 现在的 Symantec 两家公司都提供帮助 UNIX 系统管理员以非常灵活的方法管理存储设备的产品 Veritas 提供了 Veritas Volume
  • feign接口自动生成工具

    Feign Generator 介绍 最近发现开发spring cloud时 编写feign接口是一件痛苦的事 不仅要编写feign接口 还有fallback 请求参数和返回值等 大量重复工作 很浪费时间 于是便想到可以编写工具自动生成fe
  • Mysql触发器

    本文主针对小白 如何在数据库有数据变动得时候及时得到内容 MySQL触发器 Triggers 是一种数据库对象 它在指定的事件 例如插入 更新或删除数据 发生时自动执行一系列预定义的操作 触发器通常用于实施业务规则 数据完整性约束和自动化任
  • CentOS-7 RHEL-8 yum源的配置(本地yum源 + 互联网yum源)

    CentOS 7 RHEL 8 yum源的配置 本地yum源 互联网yum源 yum 全称为 Yellow dog Updater Modified 是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器 基于RP
  • 11款在线视频编辑和分享网站

    这是之前介绍的一些视频编辑相关工具 16个免费开源的视频编辑软件下载 VCASMO 在线创建混合多媒体演示 12款制作视频教程的屏幕录像工具 下面是现在要介绍的11款在线视频编辑和分享网站 收集的不够完全 各取所需 Jumpcut Jump
  • 【LaTeX】两张并排图片垂直对齐

    figure中插入两张并排图片 但是垂直无法居中 解决方法 通过 raisebox 2 height 抬高图片 例如 begin figure htbp centering subfigure ReLU begin minipage t 0
  • Linux 系统 less命令详解

    Linux中的less命令是一个非常常用的文本查看工具 它可以用于查看任意大小的文本文件 支持滚动翻页 搜索 标记等功能 在本文中 我们将详细介绍less命令的用法 参数和实例 并对其背后的原理和相关技术进行简要讲解 一 less命令的基本
  • flowable流程实例笔记(1)

    RuntimeService 运行服务类 支持启动的方式 流程定义 从这里获取资源文件 执行实例 流程实例中执行的每个环节 流程实例 一个流程实例包括所有运行的节点 一个流程中流程实例只有一个 启动一个实例 public void star
  • 关于性能测试,测试人员必须要知道的

    随着各企业的业务发展 用户量以及数据量的不断增加 系统承载的压力也会随之增加 服务系统的性能好坏又严重影响企业的利益 因此 性能测试重要性与需求越来越强烈 常见的性能测试目的 性能测试是确定系统在特定工作负载下的稳定性和响应能力 在进行性能
  • RTSP和RTP、RTCP协议介绍

    一 RTSP 1 简介 RTSP Real Time Stream Protocol 协议是一个基于文本的多媒体播放控制协议 属于应用层 RTSP以客户端方式工作 对流媒体提供播放 暂停 后退 前进等操作 它主要用来控制具有实时特性的数据的
  • linux:nginx报错,提示host not found in upstream

    原因参考 解决 nginx 启动错误 nginx emerg host not found in upstream emerg host not found in upstream loaclhost
  • 代码随想录算法训练营第一天

    数组理论基础 文章链接 代码随想录 记忆 数组是存放在连续内存空间上的相同类型数据的集合 数组下标都是从0开始的 数组内存空间的地址是连续的 数组的元素是不能删的 只能覆盖 在C 中二维数组是连续分布的 像Java是没有指针的 同时也不对程