Re: [闲聊] 每日LeetCode

楼主: Rushia (みけねこ的鼻屎)   2023-02-21 11:56:42
540. Single Element in a Sorted Array
给你一个已排序整数阵列,里面的所有数字都有恰好两个,只有一个数字只有一个,
找出这个数字是什么,限制时间复杂度:O(logn)且空间复杂度:O(1)。
Example :
Input: nums = [1,1,2,3,3,4,4,8,8]
Output: 2
Input: nums = [3,3,7,7,10,11,11]
Output: 10
思路:
1.看到题目说"阵列已排序"和"时间复杂度O(logn)"就可以确定这题要用二元搜寻来
做了,问题是我们要怎么样才能每次查找都舍弃掉一半不必去查的资料。
2.首先做个边界处理,n == 1 的时候直接返回。
3.把mid作为切点,检查当前mid这个索引数字的左右两边,如果有重复数字就返回两
个重复数字的索引,否则直接返回nums[mid]。
4.要判断要往左边找还是右边找的条件是:判断某一半边的元素数量是否是偶数
举例来说,若index=[3,4]
1 1 2 3 3 4 4
因为所有数字恰好两个且只有一个数字只有一个,所以一定有一边有奇数个元素
所以去除当前重复元素之后的半边如果有奇数个元素就往那边找,另一边舍弃。
5.最后返回nums[l]即可
JavaCode:
作者: DDFox (冒险者兼清洁工)   2023-02-21 11:58:00
大师
作者: Che31128 (justjoke)   2023-02-21 11:59:00
大师
作者: abcd991276 (QQ)   2023-02-21 12:03:00
大师
作者: NTHUlagka (拉卡)   2023-02-21 12:23:00
大师 想问一下为什么长度=1时直接回传0阿 而不是nums[0]是说你那个判断不加应该也没差 底下的二分搜还是能找到答案XD想说原来长度1的测资答案刚好是0阿喔喔说错没跑二分直接回传nums[l]就是
作者: idiont (supertroller)   2023-02-21 12:50:00
没有那个判断 底下检查会超出边界 应该是必要的没事 原来有检查 那应该没差
作者: NTHUlagka (拉卡)   2023-02-21 12:51:00
不会吧 没那个判断就不会进入二分搜寻了 因为l==r可能也不需要检查双向 我是只有判断单向 你另一边会在之后被检查到
楼主: Rushia (みけねこ的鼻屎)   2023-02-21 13:17:00
对不起 我二元搜寻超烂
作者: NTHUlagka (拉卡)   2023-02-21 13:42:00
没 楼主大师
作者: dustsstar79 (穆)   2023-02-21 14:03:00
大师

Links booklink

Contact Us: admin [ a t ] ucptt.com