【LeetCode与《代码随想录》】数组篇:做题笔记与总结-Java版

2023-11-16

代码随想录地址
是学习过程中的笔记!图来自代码随想录。

理论

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

  • 数组下标都是从0开始的。
  • 数组内存空间的地址是连续的。

因此,我们在添加和删除元素的时候要移动数组内的其他元素。

注意:关于C++的vector,它是容器,不是数组——数组里的元素只能覆盖,不能删除

二维数组在内存的空间地址也是连续的。

题目

704. 二分查找

704. 二分查找

这里有两种方法:左闭右闭区间 和 左闭右开区间。
个人感觉可以左闭右开,也就是右区间取不到的原因是除法是向下取整的,所以要保持右区间大一些。

左闭右闭相关理论:
在这里插入图片描述

class Solution {
public:
    int search(vector<int>& nums, int target) {
    int l=0,r=nums.size()-1;
    int mid;
    while(l<=r)
    {
        mid=(l+r)/2;
        if(nums[mid]>target) r=mid-1;//不在mid处
        else if(nums[mid]<target) l=mid+1;
        else return mid;//等于且找到了
    }
    return -1;
    }
};

左闭右开相关理论:
在这里插入图片描述

class Solution {
public:
    int search(vector<int>& nums, int target) {
    int l=0,r=nums.size();
    int mid;
    while(l<r)
    {
        mid=(l+r)/2;
        if(nums[mid]>target) r=mid;//不在mid处,但右区间取不到,所以等于mid
        else if(nums[mid]<target) l=mid+1;//不在mid处,左区间可以取到,所以等于mid+1
        else return mid;//等于且找到了
    }
    return -1;
    }
};

一些更难的二分拓展

35. 搜索插入位置

class Solution {
public:
    int searchInsert(vector<int>& nums, int target) {
    int l=0,r=nums.size()-1;
    int mid;
    while(l<=r)
    {
        mid=(l+r)/2;
        if(nums[mid]>target) r=mid-1;
        else if(nums[mid]<target) l=mid+1;
        else return mid;//找到了
    }
    //没找到:应该的位置是l的位置:分为r主动往左走(t太小)和l主动往右走的情况(t太大)
    //r往左走,nums[r]<t,是第一个小于t的位置——所以答案是l所在的位置
    //l往右走,nums[l]>t,是第一个大于t的位置——所以答案是l所在的位置
    return l;
    }
};

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

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

class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
    //找第一个等于t的位置和最后一个等于t的位置
    
    vector<int>ans;
    //数组为空&&左右边界
    if(nums.size()==0||nums.back()<target||nums[0]>target)  return {-1,-1};  

    //找最后一个小于t
    int ans1,ans2;
    int l=0,r=nums.size()-1,mid,temp=0;
    while(l<=r)
    {
        mid=(l+r)/2;
        if(nums[mid]>=target) r=mid-1;
        else l=mid+1;   //这里mid+1不怕超过 因为每次存的答案是r     
        ans1=r;
        temp++;
    }
    if(!temp) return {-1,-1};
    
    //找第一个大于t
    l=0,r=nums.size()-1,temp=0;
    while(l<=r)
    {
        mid=(l+r)/2;
        if(nums[mid]<=target) l=mid+1;
        else  r=mid-1;      
        ans2=l;
        temp++;
    }
    if(!temp) return {-1,-1};
    
    if(ans2-ans1>1) return {ans1+1,ans2-1};

    return {-1,-1};
    }
};

69. x 的平方根

69. x 的平方根

class Solution {
public:
    int mySqrt(int x) {
    int l=0,r=46342;
    int mid;
    while(l<r)
    {
        mid=(l+r)/2;
        if((long long)mid*mid>x) r=mid;
        else if((long long)mid*mid<x) l=mid;
        else return mid;      
        if(r-l==1) return l;
    }

    return 0;//其实绝对不会到这一步
    }
};

367.有效的完全平方数

367.有效的完全平方数

方法一:二分

class Solution {
public:
    bool isPerfectSquare(int num) {
    int l=1,r=46342;
    int mid;
    while(l<=r)
    {       
        mid=(l+r)/2;
        if((long long)mid*mid>num) r=mid-1;
        else if((long long)mid*mid<num) l=mid+1;
        else return true; 
    }
    return false;
    }
};

方法二:数学。

(n+1)2=n2+2n+1

class Solution {
public:
    bool isPerfectSquare(int num) {
    if(num==1) return true;
    int x=1;
    num--;
    while(num>0)
    {
        num-=2*x+1;
        x++;
    }
    if(num==0) return true;
    else return false;
    }
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【LeetCode与《代码随想录》】数组篇:做题笔记与总结-Java版 的相关文章

随机推荐

  • 和你一起从零开始写RISC-V处理器(2)

    RISC V加法指令的实现 文章目录 RISC V加法指令的实现 上期回顾 一 正片开始 编写各个模块 pc reg模块 if模块 rom模块 if id模块 id模块 regs模块 id ex模块 ex模块 二 顶层模块搭建 三 测试文件
  • 学懂最小生成树(克鲁斯卡尔算法)

    本节 小编将带大家了解最小生成树的第二种构成算法 克鲁斯卡尔算法 Kruskal algorithm 当然 对另一种算法感兴趣的朋友可以看看之前的这篇文章 学懂最小生成树 普里姆算法 目录 一 实现原理 二 代码实现 一 实现原理 克鲁斯卡
  • 后端开发——Flask框架从入门到入坟(中)

    前言 在上一篇文章中荔枝已经梳理了Flask的基础语法 但是想要靠这些东西来写一个项目是远远不够的噢 我们还需要一个更加清晰的项目逻辑来搭建一个Flask后端项目框架 在真实的项目开发中 我们还需要了解如何搭建数据库 如何管理高效管理代码
  • leetcode刷题——栈与队列

    队列 vs 栈 栈 从头进 从头出 只有头部一个进出口 队列 从尾进 从头处 头和尾分别负责出和进 适用于配对问题 20 有效的括号 运用栈尾进头出的思想实现配对 当我们遇到一个左括号时 我们会期望在后续的遍历中 有一个相同类型的右括号将其
  • js 判断数组是否有元素重复

    这里有一个js数组 判断数组是否有重复元素 具体代码 var vecotr for i 0 i
  • rdkafka线程过多_Kafka快速入门(十一)——RdKafka源码分析

    Kafka快速入门 十一 RdKafka源码分析 一 RdKafka C源码分析 1 Kafka OP队列 RdKafka将与Kafka Broke的交互 内部实现的操作都封装成Operator结构 然后放入OP处理队列里统一处理 Kafk
  • 计算机应用技术图像图形处理,计算机图像处理应用技术论文

    摘要 全息技术是物理学中的重大发现 近年来在各个行业得到广泛的应用 作为全息技术中的两个重要部分 CCD和计算机图像处理技术 在推动数字全息新一轮发展中起到至关重要的作用 本文将着重从计算机应用方面阐述图像处理技术在全息中的应用 关键词 计
  • 【机器学习经典算法】K近邻(KNN):核心与总结

    文章目录 1 初识K近邻 2 相知 2 1 K近邻三要素 2 2 KD树 2 2 1 kd树的构建 2 2 2 kd树的搜索 3 总结 1 初识K近邻 K 近邻 K Nearest Neighbors KNN 可以说是整个机器学习算法中最为
  • Python中的垃圾回收机制

    垃圾回收 Garbage Collection 以下简称GC 是一种自动的内存管理机制 有许多不同的实现算法 Python中的GC 以引用计数为主 标记 清除和分代回收为辅 1 GC 在程序中定义了一个变量 就是在内存中开辟了一段相应的空间
  • 硬件系统工程师宝典(1)-----硬件系统设计应该从哪里开始?

    系统设计举足轻重的一步 需求分析 今天我们开始读张志伟老师的 硬件系统工程师宝典 这是一本非常好的入门书 对需求分析 电源 信号完整性 电源完整性 可制造性 原理图 pcb的详细设计 常用软件等进行了介绍 可以帮助我们快速了解硬件工程师需要
  • Rancher2.0-2.4备份和恢复

    rancher2 0 2 4备份和恢复 说明 此文按照rancher官网实战操作 url https docs rancher cn docs rancher2 backups 2 0 2 4 single node backups ind
  • powershell 创建多个文件

    foreach file in Get ChildItem Echo file 1 5 foreach new Item Path E txt gt 创建多个文件 new item 新的内容单元 文本 可选 删除多个文件 只需要修改 new
  • Vue.js:Select--Option >下拉框绑定和取值

    遇到了这个解决了 所以记录一下 1 Vue js 2 https www iviewui com components select 完成vue js下拉框选择绑定与取值 实现效果图如下 template代码
  • 计算机进pe按键,台式机进入pe按什么键

    我的台式机想进入pe设置下系统 但不知按什么键进入 该怎么办呢 下面由学习啦小编给你做出详细的台式机进入pe按键说明 希望对你有帮助 台式机进入pe按键说明一 开机按F12 台式机 一体机 笔记本通用 其他品牌的有按F10的 F8的 F2的
  • 小程序支付-java

    https pay weixin qq com wiki doc api wxa wxa api php chapter 7 3 index 1 支付流程步骤 1 首先调用wx login方法获取code 通过code获取openid 2
  • js中defer和async的区别

    一般情况 按照惯例 所有script元素都应该放在页面的head元素中 这种做法的目的就是把所有外部文件 CSS文件和JavaScript文件 的引用都放在相同的地方 可是 在文档的head元素中包含所有JavaScript文件 意味着必须
  • 抖音很火的召唤神龙的小游戏完整代码-召唤神龙

    抖音很火的解压小游戏 完整代码分享 有兴趣的可以试着写一下 1 index
  • MongoDB和Elasticsearch的各使用场景对比

    MongoDB vs Elasticsearch MongoDB ElasticSearch 备注 定位 文档型 数据库 文档型 搜索引擎 一个管理数据 一个检索数据 资源占用 一般 高 mongo使用c es使用Java开发 写入延迟 低
  • 【Linux】常用的 Linux 命令行

    目录 写在前面 一 查看信息指令 1 df 查看磁盘驱动器的可用空间 2 free 显示可用内存 二 常用操作指令 1 pwd 查看当前目录 2 cd 改变目录 3 ls 列出目录内容 4 file 确定文件类型 5 切换 root 普通用
  • 【LeetCode与《代码随想录》】数组篇:做题笔记与总结-Java版

    代码随想录地址 是学习过程中的笔记 图来自代码随想录 文章目录 理论 题目 704 二分查找 35 搜索插入位置 34 在排序数组中查找元素的第一个和最后一个位置 69 x 的平方根 367 有效的完全平方数 理论 数组是存放在连续内存空间