跟着《代码随想录》刷题(一)——数组

news2025/1/16 18:59:44

1.1 数组基础理论

(1)定义:数组是存储在连续内存空间相同类型数据的集合。

(2)注意:

  • 数组下标是从0开始的;
  • 数组在内存空间的地址是连续的。
    =>删除或增添数组元素难免要移动其他元素的地址

(3)数组中的元素不能删除,只能覆盖

1.2 二分查找

1.2.1 二分法介绍

(1)使用前提:数组元素是有序的。
(2)时间复杂度:O (log N)
(3)二分法的区间定义有两种:左闭右闭 [left, right]左闭右开 [left, right)

  • 左闭右闭 [left, right]

前提边界条件设置:

int left = 0;
int right = numsSize - 1; //尤其注意这里

有两点要注意:

while (left <= right) // 注意这里是 <=
if (nums[mid] < target) 
	left = mid + 1;
else if (nums[mid] > target) 
	right = mid + 1; // 注意这里有 + 1
else 
	return mid;
  • 左闭右开 [left, right)

前提边界条件设置:

int left = 0;
int right = numsSize; // 注意这里没有进行 - 1

有两点要注意:

while (left < right)  // 注意这里只是 < 
if (nums[mid] < target)
	left = mid + 1;
else if (nums[mid] > target) 
	right = mid; // 注意这里没有进行 + 1
else
	return mid;

1.2.2 相关题目推荐

704、二分查找

在这里插入图片描述

  • 左闭右闭
int search(int* nums, int numsSize, int target){
    int left = 0, right = numsSize - 1;
    int middle;

    // 用的左闭右闭[left, right]
    while (left <= right) {
        middle = left + ((right - left) >> 1);
        if (nums[middle] > target) {
            // 注意这里
            right = middle - 1;
        }else if (nums[middle] < target) {
            left = middle + 1;
        }else {
            return middle;
        }
    }
    return -1;
}
  • 左闭右开
int search(int* nums, int numsSize, int target){
    int left = 0, right = numsSize; //注意这里没有 减一
    int middle = 0;

    // 左闭右开 [left, right)
    while (left < right) {
        middle = left + ((right - left) >> 1);

        if (nums[middle] > target) {
            // 注意这里
            right = middle;
        }else if (nums[middle] < target) {
            left = middle + 1;
        }else {
            return middle;
        }
    }
    return -1;
}

35、搜索插入位置

在这里插入图片描述

  • 暴力解法
int searchInsert(int* nums, int numsSize, int target){
    // 暴力解法
    for (int i = 0; i < numsSize; i++) {
        if (nums[i] >= target) {
            return i;
        }
    }
    return numsSize;
}
  • 二分法:左闭右闭
int searchInsert(int* nums, int numsSize, int target){
    // 二分法
    int left = 0, right = numsSize - 1;
    int middle = 0;

    // 左闭右闭 [left, right]
    while (left <= right) {
        middle = left + ((right - left) >> 1);

        if (nums[middle] > target) {
            right = middle - 1;
        }else if (nums[middle] < target) {
            left = middle + 1;
        }else {
            return middle;
        }
    }

    // 注意这里,如果target没在数组里面,是返回的right + 1
    return right + 1;
}

注意:这里返回 left 也是可以的

  • 二分法:左闭右开
int searchInsert(int* nums, int numsSize, int target){
    // 二分法
    int left = 0, right = numsSize; // 注意这里没有减一
    int middle = 0;

    // 左闭右开
    while (left < right) {
        middle = left + ((right - left) >> 1);

        if (nums[middle] > target) {
            right = middle;
        }else if (nums[middle] < target) {
            left = middle + 1;
        }else {
            return middle;
        }
    }
    // 注意这里返回的是 right
    return right;
}

注意:这里返回 left 也是可以的

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

在这里插入图片描述

  • 暴力求解
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* searchRange(int* nums, int numsSize, int target, int* returnSize){
    int i;
    int flag = 1;
    int *ret = (int *)malloc(sizeof(int) * 2);

    ret[0] = -1;
    ret[1] = -1;

    for (i = 0; i < numsSize; i++) {
        if (nums[i] == target && flag == 1) {
            ret[0] = i;
            flag = 0;
        }

        if (nums[i] == target && flag == 0) {
            ret[1] = i;
        }
    }

    *returnSize = 2;

    return ret;
}
  • 二分法:分别找出左右边界
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int getRightBorder(int *nums, int numsSize, int target) {
    int left = 0, right = numsSize - 1;
    int middle = 0;
    int rightBorder = -1;

    while (left <= right) {
        middle = left + ((right - left) >> 1);

        if (nums[middle] == target) {
            rightBorder = middle;
        }

        if (nums[middle] > target) {
            right = middle - 1;
        }else {
            left = middle + 1;
        }
    }

    return rightBorder;
}

int getLeftBorder(int *nums, int numsSize, int target) {
    int left = 0, right = numsSize - 1;
    int middle = 0;
    int leftBorder = -1;

    while (left <= right) {
        middle = left + ((right - left) >> 1);

        if (nums[middle] == target) {
            leftBorder = middle;
        }
        if (nums[middle] < target) {
            left = middle + 1;
        }else {
            right = middle - 1;
        }
    }

    return leftBorder;
}

int* searchRange(int* nums, int numsSize, int target, int* returnSize){
    int *ret = (int *)malloc(sizeof(int) * 2);

    int rightBorder = getRightBorder(nums, numsSize, target);
    int leftBorder = getLeftBorder(nums, numsSize, target);

    if (rightBorder == -1 || leftBorder == -1) {
        ret[0] = -1;
        ret[1] = -1;
    }else {
        ret[0] = leftBorder;
        ret[1] = rightBorder;
    }

    *returnSize = 2;

    return ret;
}

69、x的平方根

在这里插入图片描述

  • 暴力求解
int mySqrt(int x){
    // 暴力求解
    int factor = 0;

    for (int i = 0; i <= x; i++) {
        if ((double)i * i <= x) {
            factor = i;
        }else {
            return factor;
        }
    }
    return x;
}
  • 二分法
int mySqrt(int x){
    int left = 0, right = x;
    int middle = 0;
    long temp = 0;
    int factor = 0;

    while (left <= right) {
        middle = left + ((right - left) >> 1);

        temp = (long)middle *middle;
        if (temp <= x) {
            factor = middle;
            left = middle + 1;
        }else {
            right = middle -1;
        }
    }
    return factor;
}

367、有效的完全平方数

在这里插入图片描述

  • 暴力求解
bool isPerfectSquare(int num){
    // 暴力解法
    int i;
    for (i = 1; i <= (num / 2 + 1); i++) {
        if ((long)i * i == num) {
            return true;
        }
    }
    return false;
}
  • 二分法
bool isPerfectSquare(int num){
    // 二分法
    int left = 0, right = num;
    int middle = 0;

    while (left <= right) {
        middle = left + ((right - left) >> 1);

        if ((long)middle * middle == num) {
            return true;
        }else if ((long)middle * middle > num){
            right = middle - 1;
        }else {
            left = middle + 1;
        }
    }
    
    return false;
}

参考:《代码随想录》数组篇

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/198060.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DynaSLAM-11 DynaSLAM中RGB-D运行流程(Ⅰ):调用Mask 初始化R-CNN网络

目录 1.执行例程rgbd_tum 2.SegmentDynObject::SegmentDynObject方法 3. SegmentDynObject::GetSegmentation 4.初始化SLAM系统 1.执行例程rgbd_tum /home/lhwnb/Desktop/slam/DynaSLAM/Examples/RGB-D/rgbd_tum /home/lhwnb/Desktop/slam/DynaSLAM/Vocabulary/ORBvoc.txt …

多线程与线程池demo

第一步&#xff1a;切割数据的方法 public static List<List<Integer>> getProcessData(Integer batchSize) {List<Integer> originData new ArrayList<>();for (int i 0; i < 100; i) {originData.add(i);}List<List<Integer>> proc…

深度学习笔记:神经网络的学习(2)

本章上一篇可见链接 https://blog.csdn.net/Raine_Yang/article/details/128682091?spm1001.2014.3001.5501 梯度下降法&#xff08;gradient descend&#xff09; 神经网络学习的目标是找到使损失函数最小的参数&#xff08;权重和偏置&#xff09;。通过求得损失函数&#…

【JavaEE】快速了解什么是Maven?

✨哈喽&#xff0c;大家好&#xff0c;我是辰柒&#xff01;✨ &#x1f6f0;️&#x1f6f0;️系列专栏:【JavaEE】 ✈️✈️本篇内容:学习如何使用maven&#xff01; &#x1f680;&#x1f680;代码存放仓库github&#xff1a;JavaEE代码&#xff01; ⛵⛵作者简介&#xff…

C++STL——stack与queue

stack与queuestack与queuepriority_queue容器适配器vector与list的反向迭代器模拟实现仿函数deque(了解)stack与queue模拟实现priority_queue模拟实现stack与queue 这两个就是之前数据结构学过的栈和队列&#xff0c;只不过多了几个接口。 stack&#xff1a; queue&#xff…

【MySQL】MySQL 8 的 JSON 新特性详解(1)JSON 数据类型

目录一、概述二、MySQL 8 的环境搭建三、创建数据库、数据表并插入默认数据四、JSON格式数据的增加和查询1. 增加一条带JOSN格式的数据2.查询JSON内数据3.带筛选条件的查询五、总结一、概述 你好&#xff0c;我是小雨青年&#xff0c;一名使用MySQL 8 的程序员。 MySQL 8 引入…

Hadoop安装(二) --- Hadoop安装

目录 Hadoop安装&#xff08;一&#xff09;---JDK安装 修改hadoop313的权限 更改配置文件 配置core-site.xml 配置hadoop-env.sh 配置hdfs-site.xml 配置mapred-site.xml 配置yarn-site.xml 配置环境 刷新当前的shell环境 初始化 启动所有 SH 修改hadoop31…

Android Studio 从安装到第一个Android 应用Demo

安装Android Studio 安装需要 上网 &#xff0c;我这挺顺利的&#xff0c;就是在官网下载安装包&#xff0c;一路 Next&#xff0c;大概连下载总共半个小时。 第一个应用 参考官方教程&#xff1a;https://developer.android.com/codelabs/basic-android-kotlin-compose-firs…

Redis最佳实践

一、Redis键值设计 1.1、优雅的key结构 Redis的key&#xff0c;最佳实践约定&#xff1a; 遵循基本格式&#xff1a;【业务名称】:【数据名】:【id】长度不超过44字节不包含特殊字符 好处 可读性强避免key冲突方便管理更节省内存 1.2、拒绝BigKey BigKey通常以Key的大小和…

SOLIDWORKS PDM的智能报表自动生成工具

一、SOLIDWORKS企业高级报表软件介绍&#xff1a; SolidKits.Reports&#xff08;企业高级报表&#xff09;是一款无缝集成于SOLIDWORKS PDM的智能报表自动生成工具&#xff0c;可以自动生成企业所需的各类报表数据&#xff0c;涵盖结构数据报表、离散数据报表、变更数据报表、…

rocketmq源码-consumer负载均衡逻辑

前言 这篇笔记主要记录consumer在启动过程中&#xff0c;负载均衡的逻辑&#xff0c;多个消费者组成一个消费者组&#xff0c;对于集群模式&#xff0c;同一个消费者组中的多个消费者共同消费一个topic下的所有消息&#xff0c;所以每个consumer可能会处理N个messageQueue&…

【4】KVM管理 | 虚拟机的管理 | 克隆 | 快照

目录 1、虚机基本管理 2、虚机的克隆 3、增量镜像 4、虚机快照 1、虚机基本管理 查看正在运行的虚机 [rootlocalhost ~]# virsh list Id Name State ----------------------------------------------------查看所有的虚机 [rootlocalhost ~…

Apache Oozie(1):Apache Oozie简介

1 Oozie 概述 Oozie 是一个用来管理 Hadoop 生态圈 job 的工作流调度系统。由Cloudera 公司贡献给 Apache。Oozie 是运行于 Java servlet 容器上的一个 java web 应用。Oozie 的目的是按照 DAG&#xff08;有向无环图&#xff09;调度一系列的 Map/Reduce或者Hive 等任务。Ooz…

Java SE 进阶(二)之 HashSet底层原理

文章目录前言HashSet底层原理1.哈希表2.哈希值3.底层原理4.回答三个问题前言 关于Set和HashSet的API使用可参见 集合基础入门&#xff08;Collection&#xff0c;ArrayList&#xff0c;HashSet&#xff0c;HashMap&#xff09; HashSet底层原理 1.哈希表 HashSet集合底层采…

Vue组件 —— 单文件组件

追溯vue组件问题 在未讲项目之前&#xff0c;在 这一篇内容当中就讲到了组件引入使用&#xff0c;有内置的组件和动态组件以及封装一个swiper组件&#xff0c;组件也分为全局组件和局部组件&#xff0c;在讲在项目当中去使用组件之前先简单的回顾一下组件的编写&#xff1a; &…

89.【SpringBoot-02】

SpringBoot聊一聊如何构建一个网站(十四)、.SpringBoot整合数据库操作1.整合JDBC(1).SpringData简介(2).整合JDBC(3).JdbcTemplate ⭐2. 整合Druid数据源 &#xff08;德鲁伊&#xff09;(1).Druid简介(2).配置数据源(3).配置Druid数据源监控(4).配置Druid数据源过滤器(5).注解…

Echarts的Y轴添加定值横线的示例

第010个点击查看专栏目录Echarts折线图的y轴要画一条横线&#xff0c;主要是在series中设置markLine的图表标线参数&#xff0c;具体的参考源代码。文章目录示例效果示例源代码&#xff08;共142行&#xff09;相关资料参考专栏介绍示例效果 示例源代码&#xff08;共142行&…

怎么在Windows电脑更新 DirectX ?

玩游戏的人应该都对DirectX不陌生&#xff0c;它可以提高游戏或多媒体程序的运行效率&#xff0c;增强3d图形和声音效果。但很多人都不知道DirectX该如何更新&#xff0c;这篇文章将以Win10为例&#xff0c;教大家怎么在电脑上更新DirectX。 一、检查当前DirectX版本 如果你不…

简单聊一聊组件封装

封装一个思维导图组件 最近封装了一个简单的思维导图组件&#xff0c;在此简单记录一下心里历程 组件样式 组件结构设计 节点之间的线分成三部分&#xff0c;分别是竖线左边的横线A、竖线B、竖线右边的横线C&#xff0c;所以一个节点可以包含以下几个元素&#xff1a; 横线…

VBA提高篇_18 VBA代码录制优化Select(tion)及表格合并Merge(cells()/Rows()/Columns()

文章目录1. Cells(1,1)2. Rows(Str)和Columns(Str)3. VBA合并单元格3.1 Range.MergeCells属性:3.2 Range.Merge/UnMerage属性:3.3 Range.Merge(参数True/False)3.4 操作合并/取消合并单元格的两种方法4. Select / Selection 和 录制宏的代码优化4.1 Select / Selection4.2 录制…