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

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

时间:2023-04-19 22:26:30浏览次数:47  
标签:right nums 元素 随想录 mid 27 移除 左闭 left

目录

一、基础知识
- 二分法解题思路
- 数组中删除的思路
二、题目一:704.二分查找
三、题目二:27.移除元素

一、基础知识

1.二分法解题思路

要求数组必须是有序排列,仅需要根据题目的条件去确定搜索区间。

  • 第一个关键点:区间的取值。
    一般有左闭右闭,左闭右开,左开右闭三种,这个的选择不同会影响后面循环中while(left<=right)是否需要等号。
    左闭右闭
    那么需要加上“=”,此时right = nums.length - 1,是能取到右边界。
    左闭右开
    right = nums.length,此时区间是取不到右边界的元素,循环中不用加“=”。
  • 第二个关键点:mid的计算方式mid=(left+right)/2mid=left+(right-left)/2或者mid=l+(r-l)>>1,主要是根据会不会溢出来选择,选择后者则不会溢出。

2.数组中删除元素的思路

首先,需要明确数组的元素在内存地址中是连续的,不能单独删除数组中的某个元素,只能覆盖。

  • 暴力解法
    使用两个for循环,一个用来遍历数组元素,一个用来更新数组元素。
  • 双指针方法
    通过一个快指针和一个慢指针,完成两个for循环的工作量。要明白这里面快慢指针的作用。
    快指针:寻找新的数组元素(不是目标元素的元素都是新数组的元素)。
    慢指针:更新新数组元素的下标。

二、题目一:704.二分查找

题目链接
https://leetcode.cn/problems/binary-search/
代码
左闭右闭

var search = function(nums, target) {
    // right是数组最后一个数的下标,num[right]在查找范围内,是左闭右闭区间
    let mid, left = 0, right = nums.length - 1;
    //左闭右闭,所以要加上等号
    while (left <= right) {
        // 右移运算符>> ,运算结果是一个整数的二分之一,能代替数学上除2的运算,但是比这个运算更快,防止大数溢出。
        mid = left + ((right - left) >> 1);
        if (nums[mid] > target) {
            right = mid - 1;  //区间变成[left,mid-1]
        } else if (nums[mid] < target) {
            left = mid + 1;   // 区间变成[mid+1,right]
        } else {
            return mid;
        }
    }
    return -1;
};

左闭右开

var search = function(nums, target) {
    // right是数组最后一个数的下标+1,nums[right]不在查找范围内,是左闭右开区间
    let mid, left = 0, right = nums.length;
    //不包含最右边的那个元素,所以不用加上等号
    while (left < right) {
        // 位运算 + 防止大数溢出
        mid = left + ((right - left) >> 1);
        if (nums[mid] > target) {
            right = mid;  // 区间[left,mid)
        } else if (nums[mid] < target) {
            left = mid + 1;   //区间[mid+1,right)
        } else {
            return mid;
        }
    }
    return -1;
};

三、题目二:27.移除元素

题目链接
https://leetcode.cn/problems/remove-element/

代码
暴力解法

var removeElement = function(nums, val) {
    let newlength = nums.length;
    let j = 0;
    for(let i = 0; i < newlength; i++){
        if(nums[i] === val){
            for(j = i; j < newlength - 1; j++){
                nums[j] = nums[j+1];
            }
            i--;
            newlength--;
        }
    }
    return newlength
};

双指针解法

var removeElement = (nums, val) => {
    let k = 0;
    for(let i = 0;i < nums.length;i++){
        if(nums[i] != val){
            nums[k++] = nums[i]
        }
    }
    return k;
};

标签:right,nums,元素,随想录,mid,27,移除,左闭,left
From: https://www.cnblogs.com/karenblog/p/17334231.html

相关文章

  • UESTC Final Pan's prime numbers 1272 (坑)
    FinalPan'sprimenumbersTimeLimit:3000/1000MS(Java/Others)   MemoryLimit:65535/65535KB(Java/Others)Submit StatusFinalPanlikesprimenumbersverymuch.Oneday,hewanttofindthesuperprimenumbers.Aprimenumbers n(n>4)......
  • 【web 开发基础】PHP 自定义函数之函数的返回值-PHP 快速入门 (27)
    前言在定义函数时,函数名后面括号中的参数列表是用户在调用函数时用来将数据传递到函数内部的接口,而函数的返回值则将函数执行后的结果返回给调用者。如果函数没有返回值,就只能算一个执行过程。只依靠函数做一些事情还不够,有时更需要在程序脚本中使用函数执行后的结果。由于变量的作......
  • 团体天梯练习 L2-027 名人堂与代金券
    L2-027名人堂与代金券对于在中国大学MOOC(http://www.icourse163.org/)学习“数据结构”课程的学生,想要获得一张合格证书,总评成绩必须达到\(60\)分及以上,并且有另加福利:总评分在\([G,100]\)区间内者,可以得到\(50\)元PAT代金券;在\([60,G)\)区间内者,可以得到\(20\)元......
  • P1271 【深基9.例1】选举学生会
    【深基9.例1】选举学生会题目描述学校正在选举学生会成员,有\(n\)(\(n\le999\))名候选人,每名候选人编号分别从\(1\)到\(n\),现在收集到了\(m\)(\(m\le2000000\))张选票,每张选票都写了一个候选人编号。现在想把这些堆积如山的选票按照投票数字从小到大排序。输入格式输入\(n......
  • 移除链表元素
    移除链表元素203.移除链表元素给你一个链表的头节点head和一个整数val,请你删除链表中所有满足Node.val==val的节点,并返回新的头节点。示例1:输入:head=[1,2,6,3,4,5,6],val=6输出:[1,2,3,4,5]Python解一:#Definitionforsingly-linkedlist.#classLi......
  • 27SiMn
    一、27SiMn钢板简介:27SiMn是合金钢板,读作二七硅锰,执行标准‘舞技’标准生产,钢板以正火状态交货,27SiMn钢板由于化学元素硅的加入,淬透性较高,在水中临界淬透直径达8~22mm,可切削性良好,冷变形塑性及焊接性中等;另外钢在热处理时韧性减低不多,但却有相当高的强度和耐磨性,特别是水淬时仍有较......
  • 将用户从docker组移除
    将用户从docker组移除:gpasswd-dec2-userdocker1.使用命令gpasswd删除用户要将用户从一个组中移除,需要先确定用户的帐号,然后查看要删除的组名,使用命令gpasswd-d即可实现将用户从组中移除。例如,要将用户“alice”从组“test”中移除,可以运行以下命令:gpasswd-dalicetest2......
  • 移除元素
    给你一个数组nums和一个值val,你需要原地移除所有数值等于val的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用O(1)额外空间并原地修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。说明为什么返回数值是整数,但......
  • VMWare虚拟机IP变成127.0.0.1怎么办
    输入命令:dhclient-v即可如果还不好使,可以试试下面的方法(Cnetos7)打配置文件vim/etc/sysconfig/network-scripts/ifcfg-ens33打开配置文件找到ONBOOT=no要改为ONBOOT=yes默认是ONBOOT=no,它打意思是:是否随网络服务启动,eth0生效,如果为no,则ifconfig看不到eth0 ......
  • 代码随想录 46天 day198.打家劫舍 | | 337.打家劫舍 III | 213.打家劫舍II
    你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你不触动警报装置的情况下,一夜之内能......