一、二分查找

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. 833(DIV2)——C题题解

    题目链接 题目大意: 给定n个数,你可以对数值为0的数改变其为任意值,问最后前缀和为0的个数的最大值. 思路: 这题比较可惜,自己的思路没有问题,但是他少了一些东西.对数组进行前缀和处理,我们可以发现 ...

  2. scp工具上传下载

    1.从本地复制到远程 scp local_file remote_username@remote_ip:remote_folder 或者 scp local_file remote_username@ ...

  3. halcon如何识别硬币?

    halcon如何识别硬币? 前言 最近一直在学习halcon,在此做了一个案例,分享给大家,效果图如下: 1.思路分析 通过观察,发现1元,5角,1角,它们在面值的文字描述不一样,硬币显示的花纹不一样 ...

  4. 第三方模块的下载与使用、requests模块、爬取链家二手房数据、openpyxl模块、hashlib加密模块

    目录 第三方模块的下载与使用 下载第三方模块可能会出现的问题 网络爬虫模块之requests模块 网络爬虫实战之爬取链家二手房数据 自动化办公领域之openpyxl模块 第三方模块的下载与使用 第三方 ...

  5. 初学RNN

    FNN 定义 FNN(Feedforward Neural Network),即前馈神经网络,它是网络信息单向传递的一种神经网络,数据由输入层开始输入,依次流入隐藏层各层神经元,最终由输出层输出.其当 ...

  6. 网络I/O模型 解读

    网络.内核 网卡能「接收所有在网络上传输的信号」,但正常情况下只接受发送到该电脑的帧和广播帧,将其余的帧丢弃. 所以网络 I/O 其实是网络与服务端(电脑内存)之间的输入与输出 内核 查看内核版本 : ...

  7. 【每日一题】【动态规划】2022年1月30日-NC127 最长公共子串

    描述 给定两个字符串str1和str2,输出两个字符串的最长公共子串 题目保证str1和str2的最长公共子串存在且唯一. 方法1:dp数组存子串 import java.util.*; public ...

  8. 使用JavaScript制作一个页面的电子时钟

    题目:做一个电子时钟,显示当前的年月日,时分秒,要求自动变化. 案例分析: 1.使用一个div盒子来展示时钟的内容: 2.将盒子在JavaScrip里面获取div盒子: 3.我们需要一个定时器setI ...

  9. Qt的三套无边框窗体的方案:可按比例拖拽窗体大小的无边框窗口和几个常见的无边框实例

    一.可按比例拖拽窗体大小的无边框窗口 前几天接到一个需求,就是视频广播的窗体画面要可以拖拽,修改成了可以拖拽全屏的窗口之后,又有一个问题:视频画面也被拉伸了. 由于视频画面是有比例的,所以我们最好也能 ...

  10. .Net引用根目录子文件夹下的dll文件

    在.Net开发的时候,有时候会引用一套库,这些库是由多个dll文件.正常情况下,这些dll文件需要拷贝到运行根目录下.如果这些dll文件比较多,加上其他直接引用的dll,这样会导致根目录下非常乱.我们 ...