704. 二分查找
思路:刷过很多次了,就是双指针思想,初始化一个在数组最左边的指针index_l,一个在最右边的指针index_r,当index_l < index_r 的时候通过判断index_l 和 index_r所确定的区间,缩小区间,最后夹逼出我们的目标值。
注意的点:最终状态会有两个 :1.l与r相等 最后的最终状态 直接在函数最后返回,2.l 和 r的mid是最终结果,此时我们就直接返回 否则最后 lr不会想等,不好确定返回哪个值
题解:
func search(nums []int, target int) int {r := len(nums) - 1l := 0mid := (l + r) / 2for l < r {if target < nums[mid] {r = mid - 1} else if target > nums[mid] {l = mid + 1} else {return mid}mid = (l + r) / 2}if nums[mid] != target {return -1}return mid }
时间复杂度:O(n)
空间复杂度:O(1)
27. 移除元素
思路:快慢指针,两个指针从头开始走,用快指针来更新慢指针指向的值,当且仅当慢指针指向的位置不是目标值,慢指针才移动,快指针正常移动到结尾,一次对整个数组的遍历即实现了删除。
注意的点:注意慢指针的更新条件
题解:
func removeElement(nums []int, val int) int {nums_len := len(nums)fast := 0slow := 0for fast < nums_len{nums[slow] = nums[fast]if(nums[slow] != val){slow++}fast++}return slow }
时间复杂度:O(n)
空间复杂度:O(1)
977.有序数组的平方
思路:一开始只想到了暴力解,想着把所有数平方了并排序,看了题解发现可以用双指针,然后按照双指针写了一次
注意的点:多考虑优化,
暴力题解:
func sortedSquares(nums []int) []int {for i,num := range nums{nums[i] = num * num}sort.Ints(nums)return nums }
优化:
func sortedSquares(nums []int) []int {index := len(nums) - 1res := make([]int,len(nums))l := 0r := len(nums) - 1for l < r {if nums[r]*nums[r] >= nums[l]*nums[l] {res[index] = nums[r] * nums[r]index--r--} else {res[index] = nums[l] * nums[l]index--l++}}if (l == r) {res[index] = nums[r]*nums[r]}return res }