Go里面居然还有这个方法?太秀了吧

7 篇文章 0 订阅
2 篇文章 0 订阅

博主介绍:

我是了凡,喜欢每日在简书上投稿日更的读书感悟笔名:了_凡。专注于 Go Web 后端,辅学Python、Java、算法、前端等领域。微信公众号【了凡银河系】期待你的关注。未来大家一起加油啊~


背景

LeetCode一道中等题目

题目

L32题 在排序数组中查找元素的第一个和最后一个位置

给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1]。
进阶:
	你可以设计并实现时间复杂度为 O(log n) 的算法解决此问题吗?

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。



原思路

思路:
双指针 两头指针一次只挪动一边

题解:

func searchRange(nums []int, target int) []int {
	result := []int{-1, -1}
	if len(nums) == 0 {
		return result
	}
	j := len(nums) - 1
	i1 := true
	j1 := true
	for i := 0; i != j && (i1 != false || j1 != false); {

		if nums[i] == target && i1 {
			result[0] = i
			i1 = false
		}else if i1 {
			i ++
		}

		if i == j {
			break
		}

		if nums[j] == target && j1 {
			result[1] = j
			j1 = false
		}else if j1 {
			j --
		}
	}
	return result
}

结果

在这里插入图片描述
可以看到没能通过按照这个思路应该是可以通过的,只是可能需要在想一下
这个题要求是用二分查找解决的,显然不合题意,而且没能通过

参考后

之后二分还没有想,先看了下题解看到了一个方法 SearchInts

SearchInts方法

官方注释:

// SearchInts searches for x in a sorted slice of ints and returns the index
// as specified by Search. The return value is the index to insert x if x is
// not present (it could be len(a)).
// The slice must be sorted in ascending order.

意思就是

在一个整数排序的切片中搜索x,并返回索引
由Search指定。返回值是插入x的索引(如果x是)
不存在(它可能是len(a))。
切片必须按升序排序。

可以看到正好是升序满足题意,并且找到返回索引,否则返回 len(数组a)

由此题解可为

func searchRange(nums []int, target int) []int {
	leftmost := sort.SearchInts(nums, target)
	if leftmost == len(nums) || nums[leftmost] != target {
		return []int{-1, -1}
	}
	rightmost := sort.SearchInts(nums, target + 1) - 1
	return []int{leftmost, rightmost}
}

结果

在这里插入图片描述
可以看到成功通过,但是没有符合题意,所以由下可解

题解

func searchRange(nums []int, target int) []int {
    n := len(nums)
    left := 0
    right := n-1
    for left <= right{ //二分法查找
        m := (left + right)/2
        if nums[m] == target{
            i := m
            j := m
            for (i>=0 && nums[i] == target) || (j<=n-1 &&nums[j] == target){ //左右指针扩散
                if i>=0 && nums[i] == target{
                    i--
                }
                if j<=n-1 && nums[j] == target{
                    j++
                }
            }
            return []int{i+1 ,j-1}
        }
        if nums[m] > target{
            right = m-1
        }else{
            left = m+1
        }
    }
    return []int{-1,-1}
}

结果

在这里插入图片描述


这次就先讲到这里,如果想要了解更多的golang语言内容一键三连后序每周持续更新!
  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

了 凡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值