基本思路是利用查找中间值,将中间值和target比较,判断,target在左区间还是右区间, 如果nums[mid] > target ,则说明target在左区间
right赋值为mid - 1, 如果nums[mid] > target, 则说明target在右区间,更新left = mid + 1
func search(nums []int, target int) int { high := len(nums) - 1 low := 0 for low <= high { mid := low + (high-low)/2 if nums[mid] == target { return mid } else if nums[mid] > target { high = mid - 1 } else { low = mid + 1 } } return -1 }
定义两个指针,快指针可以在for
循环 里,不用额外定义。慢指针要定义,两个都从0开始,如果快指针与目标值不相等则每一次慢指针递增一,如果相等,则慢指针停下,快指针在for循环递增,数组当前元素=数组当前索引对应的下一个元素。
func removeElement(nums []int, val int) int { l := len(nums) //fast := 0 slow := 0 for fast :=0; fast<l; fast ++{ if val != nums[fast]{ nums[slow] = nums[fast] slow ++ } } return slow }
leetcode 26
自己想的比较低效的一种写法 func removeDuplicates(nums []int) int { slow := 0 l := len(nums) ln := len(nums) if ln == 0{ return 0 } if ln<2{ return 1 } for fast :=slow+1; fast<l; fast++{ if nums[fast]== nums[slow]{ for i:=slow; i<l-1;i++{ nums[i] = nums[i+1] } fmt.Println("---") fmt.Println("l:", l) if nums[fast]==nums[slow]{ fast-- slow-- } l -- } slow ++ } fmt.Println(nums) return l }
借鉴了评论里一个大佬方案 func removeDuplicates(nums []int) int { slow := 0 fast := 1 l := len(nums) if l<2{ return l } for fast<l{ if nums[slow]!=nums[fast]{ nums[slow+1]=nums[fast] slow ++ } fast++ //l-- } return slow+1 }
对比了一下,我是对比如果相等的情况,而他的是对比不相等的情况,如果不相等那么把当前指针后一个索引的数字赋值为fast指向的数字,然后slow向后移一位,其他情况那么fast继续向后走。
leetcode844
堆栈 func backspaceCompare(s string, t string) bool { // 堆栈 return build(s)==build(t) } func build(str string)string{ s := []byte{} for i,v := range str{ if v != 35{ s = append(s, str[i]) }else if len(s)>0{ // fmt.Println("pop before:", string(s)) s = append(s[:0], s[:len(s)-1]...) // fmt.Println("pop after:", string(s)) } } return string(s) }
双指针法 func backspaceCompare(s string, t string) bool { flagS, flagT := 0, 0 i , j := len(s)-1, len(t)-1 for i>=0||j>=0 { for i >= 0{ if s[i] == 35 { flagS++ i-- } else if flagS >= 0 { flagS-- i-- }else { // 这个时候说明遇到正常字符,不用去掉的那种,这个时候需要停下,让另一个循环执行, 如果两个字符相等那么继续,不相等直接返回false break } } for j >= 0{ if t[j] == 35 { flagT++ j-- } else if flagT >= 0 { flagT-- j-- }else{ break } } if i>=0&&j>=0{ if s[i]!= t[j]{ return false } }else if i>=0||j>=0{ return false } // 能坚持到这,说明都是被break了, 没有-- i-- j-- } return true }