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

二分法

(1)先找到中间值mid,然后对左右元素进行判断,如果都不等于,就证明该元素为单独的
(2)如果左相等或者右相等,就根据情况进行在次二分
重点在于如何判断mid值二分 左边还是右边
通过判断mid和相等这mid+1或者m-1,前后的数组元素的奇偶
奇数证明该数组含有单个元素,就进行二分继续查找
在这里插入图片描述

public static int singleNonDuplicate(int[] nums) {	
		int left = 0;
		int right = nums.length-1;
		
		while(left < right) {
			int mid = left + (right - left) / 2;//找中间值
			
			
			if(nums[mid] == nums[mid+1]) {//中间值和右边一样
				//判断mid和mid+1 两边的数的奇偶,如果是偶数,说明该侧都是成对出现的 
				if((mid - left) % 2 == 0) {//如果mid右侧的元素数组为偶数
					left = mid + 2;//让左指针指向mid+1后面
				}else {//如果mid右侧的元素数组不为偶数,即mid左侧的元素数组为积数
					right = mid -1;
				}
			}else if (nums[mid] == nums[mid-1]) {
				if((mid-1 - left) % 2 == 0) {
					left = mid + 1;
				}else {
					right = mid-2;
				}
			}else {
				return nums[mid];
			}
		}
		return nums[left];

    }

真的不会写算法

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值