当前位置: 首页 > news >正文

day1| 704. 二分查找、27. 移除元素

704. 二分查找

题目链接:https://leetcode.cn/problems/binary-search/
文档讲解:https://programmercarl.com/0704.%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE.html
视频讲解:https://www.bilibili.com/video/BV1fA4y1o715

1、二分法的前提

这道题目的前提是数组为有序数组,同时题目还强调数组中无重复元素,因为一旦有重复元素,使用二分查找法返回的元素下标可能不是唯一的,这些都是使用二分法的前提条件

2、二分法的两种写法

第一种写法,我们定义 target 是在一个在左闭右闭的区间里,也就是[left, right]

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

  • while (left <= right) 要使用 <= ,因为left == right是有意义的,所以使用 <=
  • if (nums[middle] > target) right 要赋值为 middle - 1,因为当前这个nums[middle]一定不是target,那么接下来要查找的左区间结束下标位置就是 middle - 1
    在数组:1,2,3,4,7,9,10中查找元素2,如图所示:
    在这里插入图片描述

第二种写法:定义 target 是在一个在左闭右开的区间里,也就是[left, right) ,那么二分法的边界处理方式则截然不同。
有如下两点:

  • while (left < right),这里使用 < ,因为left == right在区间[left, right)是没有意义的
  • if (nums[middle] > target) right 更新为 middle,因为当前nums[middle]不等于target,去左区间继续寻找,而寻找区间是左闭右开区间,所以right更新为middle,即:下一个查询区间不会去比较nums[middle]
    在数组:1,2,3,4,7,9,10中查找元素2,如图所示:
    在这里插入图片描述
/*** 题目:给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target  ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。*/
public class BinarySearch {public static void main(String[] args) {int[] nums ={-1,0,3,5,9,12};int target = 9;System.out.println(search1(nums,target));System.out.println(search2(nums,target));}//左闭右闭 [1,1] 1=1是有意义的,也就是left=right,nums[mid] == target是有意义的public static int search1(int[] nums ,int target){//检验目标值的合法性if (target < nums[0] || target> nums[nums.length-1]){return -1;}int left = 0;int right = nums.length-1;while (left<=right){int mid = left + ((right-left)>>1);  //位运算可以防止溢出if (nums[mid] > target) {  //在mid的左边right = mid-1;   //因为[left,right]的关系,mid已经判断完}else if (nums[mid] < target){  //在mid的右边left = mid +1 ; //与上同里}else {return mid;}}return -1;}//左闭右开 [1,1) 1=1是没有意义的,也就是当left=right,nums[mid]==target是没有意义的public static int search2(int[] nums ,int target){int left = 0;int right = nums.length;while (left<right){int mid = left + ((right-left)>>1);if (nums[mid]>target) {right = mid; //[left,mid),mid已判断,但是因为右开的关系所以在这轮是不做判断的}else if (nums[mid]<target){left = mid + 1 ; //[mid+1,right),mid已判断,所以往后移一位}else {return mid;}}return -1;}
}

27.移除元素

题目链接:https://leetcode.cn/problems/remove-element/
文章讲解:https://programmercarl.com/0027.%E7%A7%BB%E9%99%A4%E5%85%83%E7%B4%A0.html
视频讲解:https://www.bilibili.com/video/BV12A4y1Z7LP

移除思想

  • 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并原地修改输入数组。

  • 元素的顺序可以改变。不需要考虑数组中超出新长度后面的元素。

  • 双指针法(快慢指针法):通过一个快指针和慢指针在一个for循环下完成两个for循环的工作
    快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组
    慢指针:指向更新 新数组下标的位置

  //快慢指针解法public static int remove2(int[] nums,int val){int slowIndex = 0;for (int fastIndex = 0 ; fastIndex < nums.length;fastIndex++){if (nums[fastIndex] != val){nums[slowIndex] = nums[fastIndex];slowIndex ++;}}return slowIndex;}
http://www.lryc.cn/news/171102.html

相关文章:

  • R绘制箱线图
  • 利用Audit审计系统行为
  • uniapp:不同权限设置不同的tabBar
  • 如何将本地的项目上传到Git
  • [php] 文件上传的一个项目emmm
  • uniapp-时间格式和距离格式的转换
  • 【卖出备兑看涨期权策略(Covered_call)】
  • 【校招VIP】测试算法考点之智力分析
  • 【Linux 服务器运维】定时任务 crontab 详解 | 文末送书
  • Vue系列之入门篇
  • 【遥感卫星数据】Landsat数据Collection1和Collection2区别
  • socket() failed (24: Too many open files) while connecting to upstream, client
  • 认识单链表
  • pytest(二)框架实现一些前后置(固件,夹具)的处理,常用三种
  • 【计算机网络 - 自顶向下方法】计算机网络和因特网
  • 【Java 基础篇】Java Condition 接口详解
  • .360勒索病毒和.halo勒索病毒数据恢复|金蝶、用友、ERP等数据恢复
  • 计算机毕业设计 基于SpringBoot餐厅点餐系统的设计与实现 Java实战项目 附源码+文档+视频讲解
  • 天空飞鸟 数据集
  • 集成学习-树模型
  • 代码随想录算法训练营第一天(C)| 704. 二分查找 27. 移除元素
  • 重构优化第三方查询接口返回大数据量的分页问题
  • Cento7 Docker安装Zabbix,定制自定义模板
  • 网络防御--防火墙
  • 淘宝商品详情数据采集
  • mac安装virtualenv和virtualenvwrapper
  • 利用PCA科学确定各个指标的权重系数
  • 代码随想录 -- day55 --392.判断子序列 、115.不同的子序列
  • mysql5升级到mysql8的血泪教训
  • Unity 开发人员转CGE(castle Game engine)城堡游戏引擎指导手册