数组相关知识

数组下标都是从0开始的。
数组内存空间的地址是连续的
因为数组的在内存空间的地址是连续的,所以我们在删除或者增添元素的时候,就难免要移动其他元素的地址。
go声明二维数组时,系统会开辟一片连续的内存空间,依次存储所有的元素

一:二分查找

力扣704https://leetcode.cn/problems/binary-search/

之前学习二分查找的时候基本上靠肌肉记忆凭感觉,有两个小的疑惑点基本上就是碰运气。这次系统学习了这两部分的写法和原理,并对相关题目进行了扩展

二分法在写的过程中会出现的两个疑惑点:边界条件的判断
1.for循环时lefrt<=right 还是 left<right
2.mid取值时,是mid还是mid+1/mid-1

为明确解决这两个问题考虑两种区间的定义方法:

1.左闭右闭 [A,B]

在这种情况下,for lefrt<=right符合区间定义,例如[1,1]
此时lfet=0,right=len(nums)-1

(1)当nums[mid]<target时,例如,target=10。下一步要搜索的区间包含mid,且mid不符合题目要求。所以下次选择时,mid被排除,left=mid+1
(2)当nums[mid]>target时,例如,target=8。下一步要搜索的区间包含mid,且mid不符合题目要求。所以下次选择时,mid被排除,right=mid-1
(3)当nums[mid]=target时,返回mid的值

2.左闭右开 [A,B)

在这种情况下,for lefrt<right符合区间定义,例如[1,2),此时两数相等已经不符合定义
此时lfet=0,right=len(nums)要包含到数组的最后一个值

(1)当nums[mid]<target时,例如,target=10。往右移动,下一步要搜索的区间包含mid。所以下次选择时,mid被排除,left=mid+1
(2)当nums[mid]>target时,例如,target=8。下一步要搜索的区间不包含mid,所以下次选择时,right=mid,但此时由于左闭右开mid不被包含
(3)当nums[mid]=target时,返回mid的值

变形问题:(有重复元素)

第一个的问题都向前看

1.查找第一个等于目标值的下标 重点是看mid前一个元素是否==target


在已知nums[mid]=target的情况下
(1)如果nums[mid-1]=target,说明还要继续向前搜寻
(2)如果nums[mid-1]!=target,则找到了第一个等于的元素

//时间复杂度O(logn)
//空间复杂度O(1)
func contains(nums []int,target int){ if nums==nil || len(nums)==0{ return -1 }left:=0right:=len(nums)-1for left<=right{ mid:=(right-left)/2+leftif target==nums[mid]{ //符合下面的两个条件之一就返回mid//1.mid是数组的第一个元素//2.mid前面的元素不等于targetif mid==0 || target!=nums[mid-1]{return mid}else{right=mid-1}}else if target<nums[mid]{ right=mid-1}else{left=mid+1}}return -1
}

2.查找第一个大于等于目标值的下标

在nums[mid]>=target的情况下
(1)如果nums[mid-1]>=target,说明还要继续向前搜寻
(2)如果nums[mid-1]<target,则找到了第一个等于的元素

func search(nums []int, target int) int { if nums==nil || len(nums)==0{ return -1 }left:=0right:=len(nums)-1for left<=right{ mid:=(right-left)/2+leftif target<=nums[mid]{ //符合下面的两个条件之一就返回mid//1.mid是数组的第一个元素 //2.mid前面的元素小于targetif mid==0 || nums[mid-1]<target{ return mid}else{right=mid-1}}else{left=mid+1}}return -1
}

最后一个往右边看,后看

3.查找最后一个等于目标值的下标


在已知nums[mid]=target的情况下
(1)如果nums[mid+1]=target,说明还要继续向后搜寻
(2)如果nums[mid+1]!=target,则找到了最后一个等于的元素

func search(nums []int, target int) int { if nums==nil || len(nums)==0{ return -1 }left:=0right:=len(nums)-1for left<=right{ mid:=(right-left)/2+left    if target==nums[mid]{//符合下面的两个条件之一就返回mid//1.mid是数组的最后一个元素//2.mid后面的元素!=targetif mid==len(nums)-1 || nums[mid+1]!=target{     return mid}else{left=mid+1 }}else if target<nums[mid]{ right=mid-1}else{left=mid+1}}return -1
}

4.查找最后一个小于等于目标值的下标

在nums[mid]<=target的情况下
(1)如果nums[mid+1]<=target,说明还要继续向后搜寻
(2)如果nums[mid+1]>target,则找到了最后一个大于等于的元素

func search(nums []int, target int) int { if nums==nil || len(nums)==0{ return -1 }left:=0right:=len(nums)-1for left<=right{ mid:=(right-left)/2+leftif target>=nums[mid]{ //符合下面的两个条件之一就返回mid//1.mid是数组的第一个元素//2.mid前面的元素小于targetif mid==len(nums)-1 || nums[mid+1]>target{ return mid}else{left=mid+1}}else{right=mid-1}}return -1
}

相关题目34 35 69是剑指和top100的题目

简单 lc 704 号算法题:二分查找
中等 lc 34 :排序数组中找元素的第一个和最后一个位置【top100】
简单 lc 35 & 剑指 53-1:搜索插入位置【top100】
简单 lc 69 & 剑指 072 :x 的平方根

二、移动元素

方法一:快慢指针

func removeElement(nums []int, val int) int { if len(nums)==0{ return 0 }slow,fast:=0,0for fast<len(nums){ if nums[fast]!=val{ nums[slow]=nums[fast]slow++}fast++    }return slow
}

方法二:对撞指针

进阶:如果要删除的元素特别少,且是前面的

需要对整个数组的元素重新赋值,很费时

如果left对应的值是需要删除的,就把right的值赋给left,right–
如果不需要删除,left++

直到left>right

func removeElement(nums []int, val int) int { if len(nums)==0{ return 0 }left,right:=0,len(nums)-1for right>=left{     if nums[left]==val{ nums[left]=nums[right]right--}else{    left++}}return right+1
}

代码随想录第一天| 704. 二分查找、27. 移除元素相关推荐

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

    理论基础 1.数组是存放在连续内存空间上的相同类型数据的集合 2.数组可以方便的通过下标索引的方式获取到下标下对应的数据 3.数组的在内存空间的地址是连续的,所以我们在删除或者增添元素的时候,就难免要 ...

  2. Leetcode 704.二分查找 27.移除元素 代码随想录day1

    本系列目的在于跟练代码随想录,以及记录自己在数据结构与算法方面的一些学习 704.二分查找 其实之前自己在随便刷题的时候看过这道题目,就是一个纯新手的大状态,第一次听到二分查找这样的东西,然后跟着题解 ...

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

    文章目录 704.二分查找 思路 代码实现 27.移除元素 思路 代码实现 704.二分查找 题目链接:704.二分查找 思路 使用二分法的前提条件: 1.有序数组 2.无重复元素 代码实现 左闭右闭 ...

  4. 代码修炼Day1_LeetCode704二分查找27移除元素

    代码修炼Day1_LeetCode704二分查找&27移除元素 一些数组基本知识 数组下标都是从0开始的 数组内存空间的地址是连续的 题目链接: 力扣704二分查找 二分查找思想 针对升序数组 ...

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

    代码随想录算法Day1 | 704. 二分查找.27. 移除元素 Last edited time: April 5, 2023 11:27 AM 数据理论基础 数组是存放在连续内存空间上的相同类型数 ...

  6. 第一天| 704. 二分查找、27. 移除元素。

    第一天| 704. 二分查找.27. 移除元素. 704.二分查找 1. 题目描述 题目链接:力扣704题 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函 ...

  7. 打卡第一天 704. 二分查找、27. 移除元素

    打卡第一天| 704. 二分查找.27. 移除元素 704.二分查找 看到题目就想到曾经做过类似的,先取得左右边界,然后求中间值,如果要求的数在nums[middle]左边,就把右边界取middle- ...

  8. 代码随想录Day01:数组理论基础、二分查找、移除元素

    目录 数组理论基础.二分查找.移除元素 1.数组理论基础 2.Leetcode704.二分查找 方法一 左闭右闭: 方法二 左闭右开: 方法三 左开右开: 方法四 左开右闭: 3.Leetcode27 ...

  9. Day01.二分查找、移除元素

    Day01.二分查找.移除元素 0704.二分查找 题目链接:0704.二分查找 思路:二分查找,仅对有序数组有效.每次需要数组的中间值,与目标值比较大小,如果中间值比目标值大,说明目标值位置在lef ...

最新文章

  1. 【数据挖掘】数据挖掘总结 ( K-Means 聚类算法 | 二维数据的 K-Means 聚类 ) ★
  2. 如何在React Native中创建精美的动画加载器
  3. Linux下修改IP
  4. ssl charles 参数看不到_偷偷告诉你Charles的秘密
  5. javascript学习----window对象的学习与总结
  6. MySQL和数据库可视化工具的下载与安装
  7. 图形推理1000题pdf_这7道幼儿园数学思维题,能答对一半智商肯定不低
  8. PKPM200608/CARD-1 8.0/TPM5000/神机妙算(黄狗)/桥梁通7.09/福莱一点通8.3/纬地5.82
  9. Java 敏感词过滤工具类及文本
  10. 软件测试的环境部署怎么做?
  11. Android qq 登录 界面 圆头像
  12. Unicast与Multicast
  13. 【无2022年聚合工艺考试模拟100题模拟考试平台操作
  14. [SCUCTF2022]校赛Web出题笔记
  15. 安全日志:/var/log/secure 详解
  16. SQL*Plus中 Set timing on的时间显示单位
  17. 编译原理8:递归下降分析器、扩充巴斯克范式、JavaCC
  18. 爱立信软件测试英语笔试题,爱立信测试平台(dallas)开发岗位offer咨询
  19. 中国青年报:有多少网络论坛永远免费
  20. Android 实现答题器功能(通过手势实现翻页效果)

热门文章

  1. 名帖01 春秋 秦国《石鼓文》
  2. 茶饮奶茶小程序解决方案
  3. 骨传导蓝牙耳机怎么样、性价比最高的骨传导耳机排行
  4. 新人交互设计师的作品集制作
  5. 《千与千寻》观后感 别忘了自己最初的样子
  6. 绝地求生刺激战场模拟器怎么设置操作最流畅?刺激战场灵敏度最佳设置
  7. 天猫首页悬浮层制作原理
  8. VirtualBox复制虚拟机ip冲突解决
  9. (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  10. 拿什么来拯救你——我的时间