当前位置: 首页 > news >正文

网页链接制作生成二维码上海小红书seo

网页链接制作生成二维码,上海小红书seo,江西企业网站建设费用,东莞+网站建设+定制水LeetCode双指针:有序数组中的单一元素 题目描述 给你一个仅由整数组成的有序数组,其中每个元素都会出现两次,唯有一个数只会出现一次。 请你找出并返回只出现一次的那个数。 你设计的解决方案必须满足 O(log n) 时间复杂度和 O(1) 空间复…

LeetCode双指针:有序数组中的单一元素

题目描述

给你一个仅由整数组成的有序数组,其中每个元素都会出现两次,唯有一个数只会出现一次。

请你找出并返回只出现一次的那个数。

你设计的解决方案必须满足 O(log n) 时间复杂度和 O(1) 空间复杂度。

示例 1:

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

示例 2:

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

解题思路

由有序数组,以及要求 O(log n) 时间复杂度和 O(1) 空间复杂度得知需使用二分查找,怎么找?考虑到它的总数一定是为奇数,那么就可以从左右两边每次划分后的数量进行查找,怎么判别获得中间值之后知道哪一边是几十个哪一边是偶数个?这个我用的笨方法:举例

  • 1、[1,1,2,3,3,4,4]右指针为6,左指针为0,除以2之后mid为3(奇数)落在第一个3上,根据预想需要调整右指针到第二个3上

  • 2、[1,1,2,2,3,3,4]右指针为6,左指针为0,除以2之后mid为3(奇数)落在第二个2上,根据预想需要调整左指针到第一个2上

  • 3、[1,2,2,3,3]右指针为4,左指针为0,除以2之后mid为2(偶数)落在第二个2上,根据预想需要调整右指针到第二个2上

  • 4、[1,1,2,2,3]右指针为4,左指针为0,除以2之后mid为2(偶数)落在第一个2上,根据预想需要调整左指针到第一个2上

可能此种解释比较麻烦,我也没找到让自己和解的方法,仅代表我自己的理解

接下来就是进行归类,我把需要移动左指针的进行归类(1,3)先进行假设:

    1. 若mid为奇数判断它和它前一个是否相等,相等则左指针调整
    1. 若mid为偶数判断它和它后一个是否相等,相等则左指针调整

带入2,4情况,发现符合,可以试试找规律,自己推出来较为容易理解,上述也可以不知道这一种选择,改变判等的位置,相应更改后边即可

代码

public class BinSearch3 {public int singleNonDuplicate(int[] nums) {int low = 0, high = nums.length - 1;while (low < high) {int mid = (high - low) / 2 + low;//若mid为偶数判断它和它后一个是否相等,相等则左指针调整if (mid%2==0){if (nums[mid] == nums[mid + 1]){low = mid + 1;}else {high = mid;}//若mid为奇数判断它和它前一个是否相等,相等则左指针调整}else {if (nums[mid] == nums[mid - 1]){low = mid + 1;}else {high = mid;}}}return nums[low];}public static void main(String[] args) {BinSearch3 b=new BinSearch3();System.out.println(b.singleNonDuplicate(new int[]{1,1,2,3,3,4,4}));}
}

代码优化

如上,判定奇偶情况代码十分臃肿,冗余,对其进行进一步改进,此时需要了解^的使用

位运算的异或操作符 ^。二进制中,异或有一个有趣的性质,即 a ^ bab 不相同时结果为 1,相同时结果为 0。

1 ^ 3 的结果是 01 ^ 11 = 10,即十进制中的 2

带入上述例子[1,1,2,2,3,3,4]mid=3,为奇数将2和1进行异或 01 ^ 11 = 10即十进制中的 2那么不正是相当于对其进行了减一操作

同理,当mid=2时,01 ^ 10 = 11即十进制中的 3那么不正是相当于对其进行了加一操作

因此对其进行优化后:

public class BinSearch3 {public int singleNonDuplicate(int[] nums) {int low = 0, high = nums.length - 1;while (low < high) {int mid = (high - low) / 2 + low;if (nums[mid] == nums[mid ^ 1]) {low = mid + 1;} else {high = mid;}}return nums[low];}public static void main(String[] args) {BinSearch3 b = new BinSearch3();System.out.println(b.singleNonDuplicate(new int[]{1, 1, 2, 3, 3, 4, 4, 8, 8}));}
}
http://www.mmbaike.com/news/44838.html

相关文章:

  • 嘉兴网站建设方案策划seo推广有哪些方式
  • 荣成市城乡建设局网站怎么营销自己的产品
  • 榆林做网站需要注意的几点百度推广运营怎么做
  • ghost和wordpressseo营销论文
  • 网站目录提交重庆seo排名公司
  • 简述网站开发的过程免费外链发布平台
  • 网站的衡量标准小红书seo排名帝搜软件
  • 1800做网站因为专业贵州二级站seo整站优化排名
  • app网站开发哪家专业济南做seo的公司排名
  • 天津做网站那家好网络推广的渠道有哪些
  • 怎样做淘宝的导购网站培训班管理系统 免费
  • 做网站用需要几个软件每日英语新闻
  • 网站开发公司哪个好外贸推广代理
  • jquery网站开发简述网站建设的流程
  • 网站源码在线提取深圳网络营销推广外包
  • 怎样做网站维护平台交易网
  • 做四级题目的网站电商seo什么意思
  • wordpress 登陆样式绍兴百度seo排名
  • 长沙企业建站按效果付费域名批量查询系统
  • 网络网站关键词2023年4月疫情恢复
  • 网站建设的三要素专门看广告的网站
  • 建站论坛系统全网媒体发布平台
  • 南宁网站提升排名免费crm网站不用下载的软件
  • 金融网站如何做设计北京seo外包平台
  • 2017两学一做竞赛网站网络seo是什么意思
  • ecshop网站搬家今天的新闻 最新消息摘抄
  • 郑州英语网站建设现在推广一般都用什么软件
  • 做免费试用的网站pageadmin建站系统
  • 平台网站建设源码中国目前最好的搜索引擎
  • 酒东莞网站建设技术支持北京首页关键词优化