目录
数组理论基础
数组是存放在连续内存空间上的相同类型数据的集合。数组可以方便的通过下标索引的方式获取到下标下对应的数据。
数组的下标从0开始 array[0].....arra[n],数组在内存中是连续的。
704.二分查找
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
思路1:暴力遍历:
遍历整个nums,当nums[I] == target时候返回下标i。
func search(nums []int, target int) int {
for i:=0;i<len(nums);i++{
if nums[i] == target {
return i
}
}
return -1
}
思路2:二分查找
二分查找思想:
1、每次查找都从区间[left....right]的中间查找。
2、如果查找的middle大于target则下一次要寻找的范围应该减小,即right = middle - 1。
3、如果查找的middle小于target则下一次要寻找的范围要扩大,即left = mid + 1。
二分查找的条件:
1、数组:数据根据下标可以以O(1)时间复杂度访问元素的值。
2、有序(特殊情况下可以无序)
func search(nums []int, target int) int {
left, right := 0, len(nums)-1 //left为区间的第一个下标,right为区间的最后一个下标
for left <= right {
middle := left + (right - left) / 2
// 也可以用middle = (left + right)/2,当数值变大时可能存在溢出风险
if nums[middle] == target { // nums[middle] == target的时候
return middle
} else if nums[middle] > target { // nums[middle] > target的时候
right = middle - 1
} else { // nums[middle] < target的时候
left = middle + 1
}
}
return -1 //返回不存在的情况
}
27.移除元素
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
思路1:暴力循环
第一层循环遍历,用来匹配到要求的val。
第二层循环用来更新数组,用来将val之后的元素原地往前覆盖一位。这样就原地删除了val。
func removeElement(nums []int, val int) int {
num_len := len(nums)
for i:=0;i<num_len;i++{ //第一层遍历匹配要求的val
if nums[i] == val {
for j:=i+1;j<len(nums);j++{ //第二层循环用来将val及其之后的元素往前移动一位
nums[j-1] = nums[j]
}
i-- //此时删除了一个元素了,i要--因为要和这次循环之后的++抵消啊。
num_len-- //总的长度因为删除了一个元素所以也要--
}
}
return num_len //最终返回就可以了
}
时间复杂度:O(n^2) //两重循环处理。
空间复杂度:O(1) //只用了数组
思路2:双指针
双指针的意思其实就是两个辅助的工具人。一个用于探究敌情,一个根据敌情做出行动。
开玩笑开玩笑,双指针我一般喜欢用fast(探究敌情)和slow(做出行动)。实际上fast是去遍历我们想要的东西或者不想要的东西,slow用于更新我们想要的val的数组下标值。
- 快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组
- 慢指针:指向更新 新数组下标的位置
func removeElement(nums []int, val int) int {
slow := 0
for fast:=0;fast<len(nums);fast++{
if nums[fast] != val {
nums[slow] = nums[fast]
slow++
} else if nums[fast] == val { //这句话可以不用写的
continue
}
}
return slow
}
时间复杂度:O(n)
空间复杂度:O(1)
总结:
本文讲解了二分查找的基本用法、快慢指针的基本用法。对应LeetCode704和LeetCode27。使用Go语言实现。