(二分查找的应用)LeetCode#540. Single Element in a Sorted Array

  • 题目:一个有序的数组中,只有一个元素只出现一次,其余元素都出现两次,找出出现一次的这个元素(时间复杂度要求为o(logn) 空间复杂度要求为o(1))
  • 难度:Medium
  • 思路:由于数组是排好序的,自然而然想到二分查找,通过判断nums[mid]的值来调整left和right指针
  • 代码:
public class Solution {
    public int singleNonDuplicate(int[] nums) {
        if(nums == null || nums.length == 0){
            return -1;
        }
        int len = nums.length;
        int left =0;
        int right = len-1;
        //while循环的条件一定是小于等于
        while(left <= right){
            int mid = left + (right-left)/2;
            //分三种情况:mid=0 mid=len-1 (mid !=0 && mid !=len-1)
            if(mid != 0 && mid != len-1){
                if(nums[mid] != nums[mid-1] && nums[mid] != nums[mid+1]){
                    return nums[mid];
                }else if(nums[mid] == nums[mid+1]){
                    if(mid%2 == 1){
                        right = mid-1;
                    }else{
                        left = mid+2;
                    }
                }else{

                    if((mid-1)%2 == 1){
                        right = mid-2;
                    }else{
                        left = mid+1;
                    }
                    System.out.println(left + " - " + right);
                }
            }else if(mid == 0){
                if(nums[mid] == nums[mid+1]){
                    left = 2;
                }else{
                    return nums[mid];
                }
            }else{
                if(nums[mid] == nums[mid-1]){
                    right = len-3;
                }else{
                    return nums[mid];
                }
            }
        }
        return nums[left+1];
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值