代码随想录刷题第一天|704二分查找、27移除元素

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
}
posted @ 2022-09-21 17:00  xiaoxu365  阅读(15)  评论(0)    收藏  举报