704.二分查找
题目链接: https://leetcode.cn/problems/binary-search/description/
关键词:有序数组
解法一:二分查找
注意:自己预设的区间是左闭右闭区间还是左闭右开
func search(nums []int, target int) int {
left := 0
right := len(nums) - 1 //0~numsSize-1即默认了左闭右闭区间
for left <= right {
mid := left + (right - left) /2 //防止int溢出
if target == nums[mid] {
return mid
} else if target < nums[mid] {
right = mid - 1
}else{
left = mid + 1
}
}
return -1
}
心得:判断循环条件是否大于等于还是仅大于、是否要加1或减1等此类情况,就是看该数是否在你的判断区间内,如此题:for left <= right 要加上等于号,因为是左闭右闭区间,在left = right时,如[1,1]区间, 1是在你的判断区间内的,故需要等于号
解法二:暴力法
一个for-range循环即可
func search(nums []int, target int) int {
for index, val := range nums{
if target == val{
return index
}
}
return -1
}
27.移除元素
题目链接: https://leetcode.cn/problems/remove-element/description/
关键词:数组
解法一:快慢指针
func removeElement(nums []int, val int) int {
slow := 0
length := len(nums)
for fast := 0; fast < len(nums); fast++{ //快指针遍历数组
if(val != nums[fast]){ //保留非目标元素,快指针会不断向前走,而else使得慢指针会停在需要移除的元素的位置
nums[slow] = nums[fast]
slow++
}else{ //数组减小的时机就是nums[fast] = val
length--
}
}
return length
}
解法二:暴力法
双for循环
func removeElement(nums []int, val int) int {
length := len(nums)
for i := 0; i < length; i++{
if val == nums[i]{
for j := i + 1; j < length; j++{ //保证最后一个数的移动操作能完成
nums[j - 1] = nums[j]
}
length--
i-- //被移除元素的位置被新元素代替,故i--再判断一次这个位置
}
}
return length
}