• LeetCode——540. Single Element in a Sorted Array


    题目:Given a sorted array consisting of only integers where every element appears twice except for one element which appears once. Find this single element that appears only once.

    大意:给定一个已排序、全是整数int、每个元素出现两次(除了单独出现一次的元素)的数组,找到这个单独的元素。

    例1:

    Input: [1,1,2,3,3,4,4,8,8]
    Output: 2

    例2:

    Input: [3,3,7,7,10,11,11]
    Output: 10

    要求:时间复杂度为O(log n)空间复杂度为 O(1) 。

     这是一个查找特定元素的题,要求时间复杂度是O(log n),所以其实基本就提示使用二分查找吧,二分查找的原理就是把数组分为均等的两个部分a、b,判断想要寻找的元素在a、还是b,如果在a就再把a分为两半,再进行判断,直到查找成功。

    public static int rank(int[] nums ,int key){
        int start = 0;
        int end = nums.length - 1;
        while (start < end){
            int mid  = start + (end - start) / 2;
            if(nums[mid] < key){
                //在右半部分
                start = mid + 1;
            }else if(nums[mid] > key) {
                //在左半部分
                end = mid - 1;
            }else {
                return nums[mid];
            }
        }
        return nums[start];
    }

    这是是使用二分查找查找排序好的数组的一个方法,通过对比nums[mid]和key的大小不断缩小查找的范围,直到查找成功为止。我们要修改的就是缩小范围的方法。

    我把数组的索引分为偶数和奇数,从0开始是偶数,1是奇数,数组nums[1,1,2,2,3,4,4,5,5]是这样的

    数组中单独出现的元素是3,我们可以观察到的规律有,在单个元素出现之前nums[偶数]的右边也就是下一个元素是和它相等的,nums[奇数]的左边也就是上一个元素是和它相等的,也可以解释为:一组相等的数的索引开始时是 偶奇、偶奇、偶奇、当出现一个单独的元素时就打破了这个规律,变成了偶奇、偶奇、偶奇、偶、奇偶、奇偶、奇偶。

    所以我们得到答案,设索引为a,如果a为偶数且和它的下一个数是相等的则单独的数出现在索引a之后,如果a为奇数且和它的上一个数是相等的则单独的数出现在索引a之后。所以代码就是:

    public static int singleNonDuplicate(int[] nums) {
        int start = 0;
        int end = nums.length - 1;
        while(start < end){
            int mid = start + (end - start) /2;
            if(mid%2 != 0 && mid - 1 >= 0 && nums[mid] == nums[mid - 1] ||
                    mid%2 == 0 && mid + 1 < nums.length && nums[mid] == nums[mid + 1] ){
                start = mid + 1;
            }else{
                end = mid - 1;
            }
        }
        return nums[start];
    }
  • 相关阅读:
    [哈工大操作系统]一、环境配置
    [算法笔记]带权并查集
    C++:Reference to non-static member function must be called
    [算法笔记]并查集
    C++:string.size()比较问题
    [算法笔记]二分总结
    【LeetCode每日一题】2020.10.15 116. 填充每个节点的下一个右侧节点指针
    1Manjaro的安装
    【《你不知道的JS(中卷②)》】一、 异步:现在与未来
    【LeetCode每日一题】2020.7.14 120. 三角形最小路径和
  • 原文地址:https://www.cnblogs.com/xxbbtt/p/8302477.html
Copyright © 2020-2023  润新知