一、二分查找

1.二分查找方法概述

  • 二分查找是针对有序数组的一种查找方式。是利用(letf+right)/2 = mid的方式来对半缩短搜索范围的一种方法,一次查找,搜索的范围就会减半。相较于简单查找找寻一个target需要n步,则二分查找则最多只需查找log2n步。

2.具体实现

方法一

点击查看代码
class Solution {
public int search(int[] nums, int target) {
int left = 0;
int right = nums.length -1;
while(left <= right){
int mid = (right+left)/2;
if(nums[mid] == target){
return mid;
}else if(nums[mid] > target){
right = mid - 1;
}else{
left = mid + 1;
}
}
return -1;
}
}

方法二

点击查看代码
class Solution {
public int search(int[] nums, int target) {
int left = 0;
right = nums.length;
while (left < right) {
int mid = left + ((right - left) >> 1);
if (nums[mid] == target)
return mid;
else if (nums[mid] < target)
left = mid + 1;
else if (nums[mid] > target)
right = mid;
}
return -1;
}
}

3.要点总结

1.关于length是否-1的问题

  • length是否-1取决于区间是左闭右闭区间( [ ],还是左闭右开区间( [ ) ).当选取左闭右闭区间( [ ]时,length则需要-1,因为搜索区间包含右边界值,即整个数组下标都能取到则length需要-1。如果是左闭右开区间( [ ) )length则不需要-1,因为右边界值不包含在搜索区间内,右边界值的取值无意义。

2.关于循环条件letf是<=还是<的问题

  • 当区间是左闭右闭区间( [ ]left则取<= right。当区间是左闭右开区间( [ ) )时,则不取=

3.关于赋值是赋mid的还是mid-1的问题

  • 当区间是左闭右闭区间( [ ]时,mid则需要-1,因为mid包含在有效值区间,已经排除。当区间是左闭右开区间( [ ) )时,mid则不需要-1,因为mid的值不包含在有效的搜索区间内,无需排除,所以无需-1

二、移除元素

1.方法概述

方法一:快慢“指针”法

  • 定义一个fast下标和slow下标,两下标同时从0下标处用来寻找需要删除的val值,fast搜索需要删除的val值,如果fast为需要删除的值则fast++slow不动,当fast不是需要删除的val值时,证明该值是返回数组中需要的值,将fast的值赋给slow,然后slow++。当fast <数值长度时说明遍历完毕,返回slow下标即为新数组的大小值。

方法一:头尾“指针”交换法(自创)

  • 定义一个头下标start和尾下标end,分别从数组的0下标处和末端下标处进行搜索需要删除的val值。目的是将前排纯在的val值移到数组内的最后。有四种情况,一是start对应值和end对应值相等则end--。二是start对应值和end对应值都不相等则start++。三是当satrt的对应值不是val而end的对应值是val的时候,end--start++。最后当start的对应值等于val的时且end的值不等于val值时,进行数值交换。最终start对应值就是新数组的长度。

2.具体实现

方法一

点击查看代码
class Solution {
public int removeElement(int[] nums, int val) {
int n = nums.length;
int left = 0;
for (int right = 0; right < n; right++) {
if (nums[right] != val) {
nums[left] = nums[right];
left++;
}
}
return left;
}
}

方法二

点击查看代码
class Solution {
public int removeElement(int[] nums, int val) {
int start = 0;
int end = nums.length-1;
while(start <= end){
if(nums[start] == val && nums[end] != val ){
int tmp = nums[start];
nums[start] = nums[end];
nums[end] = tmp;
start++;
end--;
} else if (nums[start] != val && nums[end] == val ) {
end--;
start++;
}else if(nums[start] != val && nums[end] != val ){
start++;
}else{
end--;
}
}
return start;
}
}

3.要点总结

  • 首先需要明白的时数组的相关知识,如数组的元素在内存地址中是连续的,不能单独删除数组中的某个元素,只能覆盖。然后重点是双指针的思想方法。

仅供个人参考,欢迎批评指正!

二分查找 & 移除元素的更多相关文章

  1. STL中的二分查找——lower_bound 、upper_bound 、binary_search

    STL中的二分查找函数 1.lower_bound函数 在一个非递减序列的前闭后开区间[first,last)中.进行二分查找查找某一元素val.函数lower_bound()返回大于或等于val的第 ...

  2. nyoj--214--单调递增子序列(二)(二分查找+LIS)

    单调递增子序列(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 给定一整型数列{a1,a2...,an}(0<n<=100000),找出单调递增最长子序 ...

  3. 【每日一题】2022年2月10日-NC160 二分查找-I

    描述请实现无重复数字的升序数组的二分查找 给定一个 元素升序的.无重复数字的整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标(下标 ...

  4. 【每日一题】【第一个出现的值】【二分】2022年1月10日-NC105 二分查找-II

    描述请实现有重复数字的升序数组的二分查找给定一个 元素有序的(升序)长度为n的整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的第一个出现的target,如果目标值存在返 ...

  5. 【算法训练营day1】LeetCode704. 二分查找 LeetCode27. 移除元素

    [算法训练营day1]LeetCode704. 二分查找 LeetCode27. 移除元素 LeetCode704. 二分查找 题目链接:704. 二分查找 初次尝试 看到题目标题是二分查找,所以尝试 ...

  6. #查找列表中元素,移除每个元素的空格,并查找以 a或A开头 并且以 c 结尾的所有元素

    #!/usr/bin/env python #查找列表中元素,移除每个元素的空格,并查找以 a或A开头 并且以 c 结尾的所有元素. #    li = ["alec", &quo ...

  7. 算法导论(第三版)Exercises2.3(归并排序、二分查找、计算集合中是否有和为X的2个元素)

    2.3-1: 3 9 26 38 41 49 52 59 3 26 41 52   9 38 49 57 3 41   52 26   38 57   9 49 3   41  52  26  38  ...

  8. js基本算法:冒泡排序,二分查找

    知识扩充: 时间复杂度:算法的时间复杂度是一个函数,描述了算法的运行时间.时间复杂度越低,效率越高. 自我理解:一个算法,运行了几次时间复杂度就为多少,如运行了n次,则时间复杂度为O(n). 1.冒泡 ...

  9. LeetCode总结--二分查找篇

    二分查找算法尽管简单,但面试中也比較常见.经经常使用来在有序的数列查找某个特定的位置.在LeetCode用到此算法的主要题目有: Search Insert Position Search for a ...

  10. <二分查找+双指针+前缀和>解决子数组和排序后的区间和

    <二分查找+双指针+前缀和>解决子数组和排序后的区间和 题目重现: 给你一个数组 nums ,它包含 n 个正整数.你需要计算所有非空连续子数组的和,并将它们按升序排序,得到一个新的包含 ...

随机推荐

  1. 树莓派(香橙派)通过.NET IoT 操作SPI编写屏幕驱动 顺手做个四足机器人(一)

    摘要 这片文章主要是记录自己的整活过程,涉及到的技术包括.NET IoT, .NET Web, .NET MAUI,框架采用的也是最新的.NET 7. 本人是用的树莓派Zero 2 W(ubuntu- ...

  2. 图扑 Web SCADA 零代码组态水泥生产工艺流程 HMI

    前言 水泥是建筑工业三大基本材料之一,素有"建筑工业的粮食"之称.2022 年 1-9 月水泥产量为 15.63 亿吨,生产方法包括新型干法.立窑.湿窑.干法中空窑和立波尔窑等. ...

  3. bugku 矛盾

    我承认这道题给我上了一课.... 我觉得很简单的结果不是我想的那样.... 看到这道题我第一个反应是用ascii码表示1或则16进制,或则md5,或则url,base64结果都没对 ..... 去翻了 ...

  4. A-深度学习面试题

    目录 目录 一,滤波器与卷积核 二,卷积层和池化输出大小计算 2.1,CNN 中术语解释 2.2,卷积输出大小计算(简化型) 2.3,理解边界效应与填充 padding 参考资料 三,深度学习框架的张 ...

  5. 【Hadoop学习】下:MapReduce程序编写、Hadoop序列化、框架原理、Yarn组件、设置队列

    一.MapReduce概述 1.定义 编程框架,组成分布式运算程序,运行在集群上 2.特点 优点:易于编程.扩展性.容错性(内部完成).海量数据离线处理 缺点:非实时.不擅长流式计算.不擅长DAG有向 ...

  6. Android ViewPager2 + TabLayout + BottomNavigationView

    Android ViewPager2 + TabLayout + BottomNavigationView 实际案例 本篇主要介绍一下 ViewPager2 + TabLayout + BottomN ...

  7. 【云原生 • Docker】mysql、tomcat、nginx、redis 环境部署

    注意在应用部署之前,docker 服务必须是开启状态 systemctl start docker. 目录 一.MySQL 部署 二.Tomcat 部署 三.Nginx 部署 四.Redis 部署 一 ...

  8. 网络编程 - OSI七层协议详解

    目录 网络编程基础 软件开发架构 网络编程简介 OSI七层协议简介 OSI协议之物理连接层 OSI协议之数据链路层 网络相关专业名词 OSI之网络层 OSI协议之传输层 传输层之TCP协议/UDP协议 ...

  9. python面向对象推导流程

    举例:猫狗大战 # 1.例如我们要编写一个猫狗对战小游戏 # 首先我们要定义一个猫,和一只狗 cat1 = { 'name': '小白猫', 'type': '宠物猫', 'attack_val': ...

  10. A_A01_001 KEIL4-KEIL5软件安装

    @ 目录 一.软件下载 二.交流学习 三.防止电脑误删文件操作步骤 四.KEIL4安装 五.KEIL5安装 六.注意事项 一.软件下载 KEIL4/KEIL5网盘链接 戳它跳转 提取码:omni 二. ...