[Go] LeetCode第一天|704.二分查找 27.移除元素

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
}
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值