二叉树查找元素的位置(含有重复元素,且元素个数是不确定的)

代码解析

package 在排序数组中查找第一个元素与最后一个元素;public class Solution {public int[] searchRange(int[] nums, int target) {int[] result =new int[2];result[0] = findFirstLeft2(nums,target);result[1] = findFirstRight2(nums,target);return result;}/** 查找第一个与最后一个元素,说明排序数组是含有重复元素的(原来的二叉树是不含相同元素的)* 所以这里要做一些小的调整* */
//正常不包含重复元素时利用二分查找法查找元素public static int findFirstLeft(int[] nums, int target){int left = 0;int right = nums.length-1;while (left <= right){int mid = left+(right-left+1)/2;//比较目标值和中间值的大小;if(nums[mid] > target){//说明目标值在mid的左边,缩小范围right = mid-1;}else if(nums[mid] < target){left = mid+1;}else {return mid;}}return -1;}
//包含相同元素,则要判断该元素是首元素还是末元素。public static int findFirstLeft2(int[] nums , int target){int left = 0;int right = nums.length-1;while (left <= right){int mid = left+(right-left+1)/2;//比较目标值和中间值的大小;if(nums[mid] > target){//说明目标值在mid的左边,缩小范围right = mid-1;}else if(nums[mid] < target){left = mid+1;}else {//因为该数组是按照升序排序的,所以只要判断该元素//前一个元素是否相同,就知道该元素是第一个还是第二个if(mid == 0 || nums[mid] != nums[mid-1]){//mid == 0是防止mid-1超出数组范围。//说明mid就是第一个元素return mid;}else {//说明该元素前面还有相同的元素,但是具体有几个,我们不秦楚//所以我们不能直接返回前一个元素的位置,而是缩小范围,继续找第一个元素。right = mid-1;}}}return -1;}//查找最后一个元素的位置public static int findFirstRight2(int[] nums , int target){int left = 0;int right = nums.length-1;while (left <= right){int mid = left+(right-left+1)/2;//比较目标值和中间值的大小;if(nums[mid] > target){//说明目标值在mid的左边,缩小范围right = mid-1;}else if(nums[mid] < target){left = mid+1;}else {//因为该数组是按照升序排序的,所以只要判断该元素//前一个元素是否相同,就知道该元素是第一个还是第二个if(mid == nums.length-1 || nums[mid] != nums[mid+1]){//如果mid为最后一个元素,就不存在下一个元素了//说明mid就是第一个元素return mid;}else {//说明该元素前面还有相同的元素,但是具体有几个,我们不秦楚//所以我们不能直接返回前一个元素的位置,而是缩小范围,继续找第一个元素。left = mid+1;}}}return -1;}}

代码解读

相比于传统的二叉树查找,多了一步判断元素是第一元素还是最后元素的操作。代码中都有解析。

复杂度分析

时间复杂度:O(logn)
空间复杂度:O(1)

二叉查找树(重复元素情况)相关推荐

  1. java arraylist 对象 删除_ArrayList实现删除重复元素(元素不是对象类型的情况)...

    package 集合; import java.util.ArrayList; import java.util.Iterator; /* * 去除ArrayList里面的重复元素 * * */ pu ...

  2. 全排列:不含重复元素和含重复元素的全排列

    1.不含重复元素 算法思路: 1.n个元素全排列 = (n-1)个元素的全排列+(另一个元素作为前缀) 2.出口:如果只有一个元素的全排列,则说明已经排完,输出数组: 3.不断将每个元素放在第一个元素 ...

  3. Java中ArrayList问题:删除一个ArrayList中的重复元素,注意留意一个问题

    该问题有两种方法: 一 利用两个数组,此法简单,不讨论 二 利用一个数组,从第0个开始依次取元素,并在其后元素中查找是否有该元素,有则删掉后面的重复元素,依次遍历.---但是这种情况要特别注意,当后续 ...

  4. 算法------数组---------存在重复元素

    给定一个整数数组,判断是否存在重复元素.如果任何值在数组中出现至少两次,函数返回 true.如果数组中每个元素都不相同,则返回 false.示例 1:输入: [1,2,3,1] 输出: true 示例 ...

  5. 每天一道LeetCode-----有序数组循环右移n位后,寻找最小值,数组中可能包含重复元素

    Find Minimum in Rotated Sorted Array II 原题链接Find Minimum in Rotated Sorted Array II 一个有序数组循环右移n位,找到右 ...

  6. 82. 删除排序链表中的重复元素 II(链表操作)

    给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字. 示例 1: 输入: 1->2->3->3->4->4->5 输出: 1-&g ...

  7. c语言集合除去相同元素,使用C语言去掉字符串集合重复元素

    有一种最直接的方法可以去掉一个集合中重复的元素,这种方法据说就是"交给下面去做",然而有时候,你自己动手去做一下也是不错的.如果交给下面去做,最直接的选择就是使用map,在java ...

  8. LeetCode—220. 存在重复元素 III

    220. 存在重复元素 III 题目描述: 给你一个整数数组 nums 和两个整数 k 和 t .请你判断是否存在 两个不同下标 i 和 j,使得 abs(nums[i] - nums[j]) < ...

  9. LintCode 16. 带重复元素的排列

    写在前面:这题和全排列不含重复元素的那题几乎一样,我比较垃圾,就用HashSet去掉了重复的元素但是看了九章算法的答案也没看懂,他写的很有感觉. 用了hash,本来想着怎么写hashcode()和eq ...

最新文章

  1. 2003服务器系统屏蔽广告,电脑总是乱弹广告弹窗?教你彻底关闭
  2. Redis 的内存淘汰策略问题
  3. python中文昵称-python实例pyspark以及python中文显示
  4. HTTP层 —— Session
  5. 更换YUM及升级包方法
  6. Scala元组:存放各种相同或不同类型的数据
  7. 驰骋表单设计器 设计表单案例演示
  8. BZOJ1299 [LLH邀请赛]巧克力棒
  9. Leetcode--200. 岛屿数量
  10. android jenkins 动态版本,Jenkins工具(二)之 Jenkins集成android工程
  11. 随机微分方程与 Ito Lemma 的关系
  12. Dell电脑,Win10系统,插入耳机没反应或者说听筒没声音该怎么解决?
  13. ABAP 供应商主数据比较常用的表
  14. TunePat Amazon Video Downloader使用教程
  15. 「JCVI教程」使用JCVI进行基因组共线性分析(上)
  16. 从链家网上爬取租房数据并进行数据分析
  17. 如何在一只股票坐庄散户敢死队点评
  18. 中专计算机英语词汇,中职英语新课标词汇表.doc
  19. win10系统不能复制粘贴的解决方法
  20. JavaScript 静态方法

热门文章

  1. 20172327 2017-2018-2 《程序设计与数据结构》第十一周学习总结
  2. 《深渊古纪》古剑奇谭衍生小说 阅读笔记
  3. tor 安装及使用教程
  4. mysql笔试题15道
  5. 荒野行动计算机高考题,叮咚,这里有一份荒野行动强迫症测试试卷请查收~
  6. css3空中飘浮的气球动画
  7. Axure 放大与缩小
  8. unity鼠标滚轮放大缩小
  9. python 识别图像中的文字(数字)之python图文识别
  10. 安卓中COLOR的值分析