leetcode刷题记录之540

540、有序数组中的单一元素

  给定一个只包含整数的有序数组,每个元素都会出现两次,唯有一个数只会出现一次,找出这个数。
示例 1:

输入: [1,1,2,3,3,4,4,8,8]
输出: 2

示例 2:

输入: [3,3,7,7,10,11,11]
输出: 10

注意: 您的方案应该在 O(log n)时间复杂度和 O(1)空间复杂度中运行。
难度:中等  题目地址:https://leetcode-cn.com/problems/single-element-in-a-sorted-array/

1、C语言代码:

int singleNonDuplicate(int* nums, int numsSize){
       int left=0,right=numsSize-1;
       while(left<right){
           int mid = left + (right - left) / 2;
           if(mid%2==1){
               if(nums[mid]==nums[mid+1]) right=mid-1;
               else left=mid+1;
           }else{
               if(nums[mid]==nums[mid+1]) left=mid+2;
               else right=mid;
           }
       }
        return nums[left];
}

解释: 因为是有序数组,所以可以用二分法。思路:取数组中间的数,当中间数的下标为奇数,说明前后元素的个数为奇数,偶数则剩余个数为偶数。奇数时:当nums[mid]等于[mid+1],唯一数处于前mid-1,反之处于后mid+1。偶数时:当nums[mid]等于[mid+1],唯一数处于后mid+2,反之处于前mid.(就是要保证剩余查找元素个数奇数)

知识点回顾: 无。

2、Java代码:

class Solution {
    public int singleNonDuplicate(int[] nums) {
        int num = 0;
        for(int i : nums)
            num ^= i;
        return num;
    }
}

解释: 直接用位运算,已知两个相同的数异或之后为0,所以把数组所有的数都异或了之后就是剩下的值了。

知识点回顾: ^的运算法则:只有在两个比较的位不同时其结果是1,否则结果为0。

3、Python代码:

class Solution:
    def singleNonDuplicate(self, nums: List[int]) -> int:
        return 2*sum(set(nums)) - sum(nums)

解释: 将原数组去重*2,减去原数组,剩下的就是唯一的值。

知识点回顾: 无。

4、JavaScript代码:

/**
 * @param {number[]} nums
 * @return {number}
 */
var singleNonDuplicate = function(nums) {
    for(let i = 0; i<nums.length;i+=2){             
        if(nums[i]!=nums[i+1]) return nums[i]  
    }
};

解释: 因为有序数是成对出现,所以特殊数出现的下标一定是偶数位,所以只需要拿偶数位下标去跟下一位下标的值去比较即可。

知识点回顾: 无。

你可能感兴趣的:(算法刷题,leetcode中等题,二分法)