二叉查找树(重复元素情况)
二叉树查找元素的位置(含有重复元素,且元素个数是不确定的)
代码解析
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)
二叉查找树(重复元素情况)相关推荐
- java arraylist 对象 删除_ArrayList实现删除重复元素(元素不是对象类型的情况)...
package 集合; import java.util.ArrayList; import java.util.Iterator; /* * 去除ArrayList里面的重复元素 * * */ pu ...
- 全排列:不含重复元素和含重复元素的全排列
1.不含重复元素 算法思路: 1.n个元素全排列 = (n-1)个元素的全排列+(另一个元素作为前缀) 2.出口:如果只有一个元素的全排列,则说明已经排完,输出数组: 3.不断将每个元素放在第一个元素 ...
- Java中ArrayList问题:删除一个ArrayList中的重复元素,注意留意一个问题
该问题有两种方法: 一 利用两个数组,此法简单,不讨论 二 利用一个数组,从第0个开始依次取元素,并在其后元素中查找是否有该元素,有则删掉后面的重复元素,依次遍历.---但是这种情况要特别注意,当后续 ...
- 算法------数组---------存在重复元素
给定一个整数数组,判断是否存在重复元素.如果任何值在数组中出现至少两次,函数返回 true.如果数组中每个元素都不相同,则返回 false.示例 1:输入: [1,2,3,1] 输出: true 示例 ...
- 每天一道LeetCode-----有序数组循环右移n位后,寻找最小值,数组中可能包含重复元素
Find Minimum in Rotated Sorted Array II 原题链接Find Minimum in Rotated Sorted Array II 一个有序数组循环右移n位,找到右 ...
- 82. 删除排序链表中的重复元素 II(链表操作)
给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字. 示例 1: 输入: 1->2->3->3->4->4->5 输出: 1-&g ...
- c语言集合除去相同元素,使用C语言去掉字符串集合重复元素
有一种最直接的方法可以去掉一个集合中重复的元素,这种方法据说就是"交给下面去做",然而有时候,你自己动手去做一下也是不错的.如果交给下面去做,最直接的选择就是使用map,在java ...
- LeetCode—220. 存在重复元素 III
220. 存在重复元素 III 题目描述: 给你一个整数数组 nums 和两个整数 k 和 t .请你判断是否存在 两个不同下标 i 和 j,使得 abs(nums[i] - nums[j]) < ...
- LintCode 16. 带重复元素的排列
写在前面:这题和全排列不含重复元素的那题几乎一样,我比较垃圾,就用HashSet去掉了重复的元素但是看了九章算法的答案也没看懂,他写的很有感觉. 用了hash,本来想着怎么写hashcode()和eq ...
最新文章
- 2003服务器系统屏蔽广告,电脑总是乱弹广告弹窗?教你彻底关闭
- Redis 的内存淘汰策略问题
- python中文昵称-python实例pyspark以及python中文显示
- HTTP层 —— Session
- 更换YUM及升级包方法
- Scala元组:存放各种相同或不同类型的数据
- 驰骋表单设计器 设计表单案例演示
- BZOJ1299 [LLH邀请赛]巧克力棒
- Leetcode--200. 岛屿数量
- android jenkins 动态版本,Jenkins工具(二)之 Jenkins集成android工程
- 随机微分方程与 Ito Lemma 的关系
- Dell电脑,Win10系统,插入耳机没反应或者说听筒没声音该怎么解决?
- ABAP 供应商主数据比较常用的表
- TunePat Amazon Video Downloader使用教程
- 「JCVI教程」使用JCVI进行基因组共线性分析(上)
- 从链家网上爬取租房数据并进行数据分析
- 如何在一只股票坐庄散户敢死队点评
- 中专计算机英语词汇,中职英语新课标词汇表.doc
- win10系统不能复制粘贴的解决方法
- JavaScript 静态方法