首页 > 编程语言 >算法——二分查找

算法——二分查找

时间:2023-07-02 17:35:14浏览次数:52  
标签:二分 node return target nums int 算法 查找 left

1、在有序数组中查找元素的第一个和最后一个位置

 1 class Solution {
 2     public int[] searchRange(int[] nums, int target) {
 3         int leftindex=binarySearch(nums,target);
 4         int rightindex=binarySearch(nums,target+1)-1;
 5         if(leftindex==nums.length||nums[leftindex]!=target||nums[rightindex]!=target){
 6             return new int[]{-1,-1};
 7         }
 8         return new int[]{leftindex,rightindex};
 9 
10 
11     }
12     int binarySearch(int[] nums,int target){
13         int left=0;
14         int right=nums.length-1;
15         while(left<=right){
16             int mid=left+(right-left)/2;
17             if(nums[mid]<target){
18                 left=mid+1;
19             }else{
20                 right=mid-1;
21             }
22         }
23         return left;
24 
25     }
26 }
View Code

2、x的平方根

 1 class Solution {
 2     public int mySqrt(int x) {
 3         int left = 0;
 4         int right = x;
 5         int ans = 0;
 6         while(left <= right){
 7             int mid = left + (right - left) / 2;
 8             if((long)mid * mid <= x){
 9                 ans = mid;
10                 left = mid + 1;
11             }else{
12                 right = mid - 1;
13             }
14         }
15         return ans;
16     }
17 }
View Code

3、搜索二维数组

 1 class Solution {
 2     public boolean searchMatrix(int[][] matrix, int target) {
 3         int i=0;
 4         int j=j=matrix[0].length-1;
 5         while(i<matrix.length&&j>=0){
 6             if(target==matrix[i][j])return true;
 7             else{
 8             if(target>matrix[i][j]){
 9                 i++;
10             }
11             else if(target<matrix[i][j]){
12                 j--;
13             }
14             }
15             
16         }
17         return false;
18 
19     }
20 }
View Code

4、完全二叉树的节点个数

 1 class Solution {
 2     public int countNodes(TreeNode root) {
 3         if (root == null) {
 4             return 0;
 5         }
 6         int level = 0;
 7         TreeNode node = root;
 8         while (node.left != null) {
 9             level++;
10             node = node.left;
11         }
12         int low = 1 << level, high = (1 << (level + 1)) - 1;
13         while (low < high) {
14             int mid = (high - low + 1) / 2 + low;
15             if (exists(root, level, mid)) {
16                 low = mid;
17             } else {
18                 high = mid - 1;
19             }
20         }
21         return low;
22     }
23 
24     public boolean exists(TreeNode root, int level, int k) {
25         int bits = 1 << (level - 1);
26         TreeNode node = root;
27         while (node != null && bits > 0) {
28             if ((bits & k) == 0) {
29                 node = node.left;
30             } else {
31                 node = node.right;
32             }
33             bits >>= 1;
34         }
35         return node != null;
36     }
37 }
View Code
class Solution {
    public int countNodes(TreeNode root) {
    	if(root == null) {
    		return 0;
    	}
    	int left = countNodes(root.left);
    	int right = countNodes(root.right);
    	
    	return left+right+1;
    	
    }
}

  

 

标签:二分,node,return,target,nums,int,算法,查找,left
From: https://www.cnblogs.com/coooookie/p/17521055.html

相关文章

  • 算法学习
    今天听杨老师说的,我们要去学和发展不同那些在it培训班的领域,但是我们只能从那些B站那些培训课去学习,并没有亮点,可能毕业后,还不如培训班出来的呢,所以我打算算法上面下下功夫,以后的计划是加强javaC++这两门语言基础,然后每天一道算法题。 ......
  • 二分算法学习笔记与总结
    二分算法学习笔记与总结目录二分二分原理整数二分二分查找原理二分查找模板模板一模板二二分查找用法题目1(模板)(二分查找)题目大意题目分析CODE题目2(运用)(二分查找)题目大意题目分析CODESTL中的二分查找lower_bound()upper_bound()浮点二分浮点数二分模板浮点数二分答案模板题目......
  • 「模版」二分查找(lower_bound )
    七彩评测题目描述给出有n个元素的由小到大的序列,请你编程找出某元素第一次出现的位置。(n<=1000000)Input第一行:一个整数,表示由小到大序列元素个数:下边n行,每行一个整数:最后一行一个整数x,表示待查找的元素。Output如果x在序列中,则输出x第一次出现的位置,否则输出-1.......
  • Snap算法学习01-03Snap中的类及其定义
        //graph.h定义的基本类型无向图  ///Undirectedgraph.##TUNGraph::ClassclassTUNGraph 有向图///Directedgraph.##TNGraph::ClassclassTNGraph 二部图///Bipartitegraph.##Bipartite_graphclassTBPGraph 多重图///Directedmultigr......
  • 什么是算法?
    扎实打牢数据结构算法根基,从此不怕算法面试系列之001week0102-01什么是算法? 1、什么是算法?为了明确什么是算法,我们会从简单的查找功能开始讲起。查找其实一个一个非常简单的算法,但我们会为这个查找功能的算法做如下工作:让查找的功能适应更多的数据类型通过查找的例......
  • 数据结构和算法-2023.07.01
    数据结构杂记回忆以前的一些零散的知识点杂谈......
  • 二叉树中的递归算法(二)
    从二叉树遍历看递归二叉树二叉树(binarytree)是指树中节点的度不大于2的有序树,它是一种最简单且最重要的树。二叉树的递归定义为:二叉树是一棵空树,或者是一棵由一个根节点和两棵互不相交的,分别称作根的左子树和右子树组成的非空树;左子树和右子树又同样都是二叉树。二叉树的遍......
  • 数组中查找单个不重复元素
    #include<stdio.h>intmain(){ intarr[]={1,2,3,4,5,1,2,3,4}; inti=0; intret=0; intsz=sizeof(arr)/sizeof(arr[0]); for(i=0;i<sz;i++) { ret=ret^arr[i]; } printf("%d",ret); return0;}......
  • 【Python基础】index函数-返回查找对象的首个匹配的索引位置
    描述从列表中找出某个值第一个匹配项的索引位置返回的是查找对象的索引位置,如果没有,就会抛出异常语法List.index(a,start,end)参数解释a要查找的对象(必填)start要查找的范围的开始位置索引(闭区间)(非必填)end要查找的范围的结束位置索引(开区间)(有end就必须有start,有start时可以没end)举......
  • 2023-07-01:redis过期策略都有哪些?LRU 算法知道吗?
    2023-07-01:redis过期策略都有哪些?LRU算法知道吗?答案2023-07-01:缓存淘汰算法(过期策略)当Redis的内存超出物理内存限制时,内存中的数据就会频繁地与磁盘进行交换,这个过程叫做交换(swap)。由于交换的高开销,Redis的性能会急剧下降。对于访问频率较高的Redis实例来说,这样低效的存取效率......