求栈中元素个数算法_【算法打卡】在排序数组中查找元素的第一个和最后一个位置...

bcae10906f94498f899d7dd5f36e5a49.png

难度:中等

题目:

    给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。

    如果数组中不存在目标值 target,返回 [-1, -1]

进阶:

  • 你可以设计并实现时间复杂度为 O(log n) 的算法解决此问题吗?

6eec1cc2b097c32df6f5772bca423db1.png

-----------------------------------

思考:

    一个数组,找一个数,条件也就两个:

    如果有,找出第一个和最后一个,

    如果没有,就返回【-1,-1】

    这特么不是送分题么?!

    确实送分题!

    还可以优化一下,找到以后如果后面的不等于target了就立即退出循环。

    他娘真是个天才。

b0c96c06c3c53931d496e71181350422.gif

代码:

public static int[] searchRange(int[] nums, int target) {    int first = -1, last = -1;    for (int i = 0; i < nums.length; i++) {        if (nums[i] == target) {            if (first == -1) first = i;            last = i;        } else if (nums[i] != target && last != -1)            break;    }    return new int[]{first, last};}

直接就是反手一个合上电脑睡觉

    等一下,我老。。不是,我题目呢,好像还有点东西。

591de7b04845c34cb353343d4f9c71dc.png

呃,毕竟进阶

如果你想做个five呢,就不进就不进了吧,有种就去睡觉

没错那个five就是我

不是今天。

于是又思考:

  1. 因为那个有序,还有那个找一个数字,还有,

  2. 不绕了,是个人都能看出来,二分法嘛,我们全就都用它。

  3. 折半,所以时间复杂度就是2x次方=n,x=log2n,也我们常说的就是O(logn)

代码:

public int[] searchRange(int[] nums, int target) {    return new int[]{binarySearch(nums, target, true), binarySearch(nums, target, false)};}private int binarySearch(int[] nums, int target, boolean leftRight) {    int left = 0, right = nums.length-1, result = -1, mid;    while (left <= right) {        mid = (left + right) / 2;        if (nums[mid] > target) right = mid - 1;        else if (nums[mid] < target) left = mid + 1;        else {            result = mid;            if (leftRight) right = mid - 1;            else left = mid + 1;        }    }    return result;}

‍‍‍时间复杂度:O(n)

空间复杂度:O(1)

-----------------------------------完---------------------------------

你睇我眼神劲唔劲啊

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值