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

来源:互联网 发布:数据库部门英语简写 编辑:程序博客网 时间:2024/05/16 08:24
  • 题目:一个有序的数组中,只有一个元素只出现一次,其余元素都出现两次,找出出现一次的这个元素(时间复杂度要求为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];    }}
阅读全文
0 0