704、二分查找
leetcode链接:https://leetcode.cn/problems/binary-search/
- 思路一暴力解法-遍历整个数组(切片),如果当前遍历元素和目标值一致,返回当前元素下标即可。
- 代码:
//暴力解法
for i := 0; i < len(nums);i++ {
if nums[i] == target {
return i
}
}
return -1
- 思路二:二分查找-由于数组有序,那么定义左右边界,然后不断更新左右边界的值,直到找到目标元素,这样做的目的是缩小查找范围。
- 代码:
//左闭右闭
l := 0
r := len(nums) - 1
for l <= r {
mid := (l+r) / 2
if nums[mid] < target {
l = mid+1
} else if nums[mid] > target {
r = mid-1
} else {
return mid
}
}
return -1
//左闭右开
l := 0
r := len(nums)
for l < r {
middle := (l + r) / 2
if nums[middle] > target {
r = middle
} else if nums[middle] < target {
l = middle + 1
} else {
return middle
}
}
return -1
27、移除元素
leetcode链接:https://leetcode.cn/problems/remove-element/
- 思路一:快慢双指针法-快指针获取新数组需要的元素,慢指针获取新数组中需要更新的位置
- 代码:
//快慢双指针法
var f, s int
for f, s = 0, 0; f < len(nums);f++ {
if nums[f] != val {
nums[s] = nums[f]
s++
}
}
return s
- 思路二:双向双指针法
- 代码:
l := 0
r := len(nums) - 1
for l <= r {
for l <= r && nums[l] != val {
l++
}
for l <= r && nums[r] == val {
r--
}
if l < r {
nums[l] = nums[r]
l++
r--
}
}
return l
- 思路三:暴力解决法-遍历切片,遇到目标值就再开一个循环去遍历剩余元素,然后依次把下一个元素移到前一位,最后将i--,length--
- 代码:
func removeElement(nums []int, val int) int {
length := len(nums)
for i := 0; i < length; i++ {
if nums[i] == val {
for j := i; j < length-1; j++ {
nums[j] = nums[j+1]
}
i--
length--
}
}
return length
}
标签:27,return,nums,元素,随想录,len,middle,length,移除
From: https://www.cnblogs.com/xiaoxu365/p/16715132.html