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

【leetcode】第一章数组

704. 二分查找

  • 边界值需注意
  • left代表左边界下标值,right代表右边界的下标值
  • 当数组只有一个元素时,此时如果找到该元素应该返回下标0,因此条件为left<=right
  • 当mid的元素值大于target时,此时说明我们想找的target在右边,因此需要改变右边界的值,right=mid-1。当mid的元素小于target同理。
public int search(int[] nums, int target) {int left = 0;int right = nums.length-1;int mid;while (left <= right) {mid = left + (right-left)/2;if (nums[mid] == target) {return mid;}else if (nums[mid] > target) {right = mid - 1;}else {left = mid + 1;}}return -1;}

27. 移除元素

1. 暴力解法

public int removeElement(int[] nums, int val) {// 暴力解法int size = nums.length;for (int i = 0; i < size; i++) {// 若遇到val元素,则更新数组if (nums[i] == val) {for (int j = i+1; j < size; j++) {nums[j-1] = nums[j];System.out.println("size:"+size);}size--;i--; // 由于整体向前移动了一位,因此该位的值需要进行判断,所以需要保持不动}}return size;}

2. 双指针方法

  • 定义一个left指针,一个right指针,left指向需要移除的元素,right指针用来跳过val元素,不断来更新新的元素数组。
  • 只要nums[right]不为val,则更新left指针的元素值,并同时递增两个索引。重复这一过程,直到right到达数组末尾。left为移除元素后的数组长度。
public int removeElement(int[] nums, int val) {int left = 0;for (int right = 0; right < nums.length; right++) {if (nums[right] != val) {nums[left] = nums[right];left++;}}return left;}

3. 双指针优化方法

  • 当删除的元素很少的时候(假设该数组只有第一个元素需要删除),此时使用第一种方法,假设n为数组元素的数量,则赋值操作需要进行n-1次,因此需要进行优化。
  • 当需要删除元素很少时(假设该数组只有第一个元素需要删除),我们只需要交换第一个元素和最后一个元素的值即可。因此我们定义left指针指向第一个元素,right指针指向最后一个元素,若遇到要移除的元素时,便将left此处的值赋为right位置的值。
public static int removeElement(int[] nums, int val) {int left = 0;int right = nums.length - 1;int size = nums.length;while (left < size) {if (nums[left] == val) {nums[left] = nums[right];right--;size--;}else {left++;}}return size;}

参考链接

  • 移除元素双指针方法
http://www.lryc.cn/news/124328.html

相关文章:

  • 01|Java中常见错误或不清楚
  • 递归的用法和例子
  • 极狐GitLab 企业级 CI/CD 规模化落地实践指南(一)
  • springBoot 简单的demo
  • [国产MCU]-BL602开发实例-实时时钟(RTC)
  • 大数据Flink(六十三):SqlClient工具的使用
  • 哈威比例多路阀控制放大器
  • Java bean 是个什么概念?
  • 微服务系列文章之 Springboot+Vue实现登录注册
  • 【Docker】如何在设计 dockerfile 过程中,设置容器启动后的定时任务
  • 【leetcode】第三章 哈希表part01
  • Docker中Tomcat部署步骤
  • pycharm 安装库
  • 使用 Ploomber、Arima、Python 和 Slurm 进行时间序列预测
  • springboot第35集:微服务与flutter安卓App开发
  • java 把list转成json
  • R语言实现随机生存森林(2)
  • 泛型类接口方法学习
  • Docker自动化部署安装(十)之安装SonarQube
  • [QT/C++]如何得知鼠标事件是由触摸事件转换而来的,使得鼠标触摸事件分离
  • 消防态势标绘工具,为消防基层工作助力
  • 网络协议栈-基础知识
  • [Mongodb 5.0]聚合操作
  • Shell 变量
  • SRM订单管理:优化供应商关系
  • Unity 实现2D地面挖洞!涂抹地形(碰撞部分,方法二)
  • 简化Gerber数据传输过程丨GC PowerPlace简介
  • rust关于项目结构包,Crate和mod和目录的组织
  • 如何微调优化你的ChatGPT提示来提高对话质量
  • 微信小程序实现下拉刷新