使用二分法查询二维整型数组的值(找到返回其坐标)

该二维数组的特征是:

  • a.每行中的整数从左到右按升序排列。
  • b.每行的第一个整数大于前一行的最后一个整数。

可以每行都进行二分查找(由于该数组的特征,所以可以先将要查找的数与本行的最后一个数据比较,若大于则直接进入下一行比较,增加效率,减少比较的次数),如果未找到则进入下一层,直到找完该二维数组。

private static String find(int[][] arr, int num) {    int row = 0;  //控制行数    while (row < arr.length){        int left = 0;  //行的左下标        int right = arr[row].length - 1;   //行的右下标        while (left <= right) {  //每一行进行二分查找            if(num > arr[row][right]){  //如果查找的数比该行的最后一个数还大,则直接进入下一行的比较                break;            }            //int mid = (left + right) / 2;            int mid = (right - left + 1) / 2 + left; //防止相加超过数据类型的上界              if (arr[row][mid] == num) {                return "[" + row + "," + mid + "]";            } else if (arr[row][mid] > num) {                right = mid - 1;            } else {                left = mid + 1;            }        }//退出该层while循环说明该层未找到        ++row;  //层数加一    }//退出说明未找到    return "无该整数";}

测试如下:

int[][] arr = {{1,3,5},{7,9},{15,19,20}};String index = find(arr,1);System.out.println(index);String index1 = find(arr,20);System.out.println(index1);String index2 = find(arr,9);System.out.println(index2);String index3 = find(arr,0);System.out.println(index3);

原文地址:https://www.cnblogs.com/128-cdy/p/12595893.html

时间: 2024-09-29 19:24:25

使用二分法查询二维整型数组的值(找到返回其坐标)的相关文章

数组问题(三)求二维整型数组最大联通子数组的和

相较于上次求最大子矩阵的和,这次明显更难了一些. 将问题分解并分析,可以想到 先求各行中的最大子数组,并记录下标,求完之后再将各行的最大子数组的下标进行比较可以得到两种情况 1.上一行的最大子数组下标范围和下一行的最大子数组下标范围有重合的部分. 2.上一行的最大子数组下标范围和下一行的最大子数组下标范围无重合的部分. 程序代码: #include<iostream> using namespace std; int calculate(int n,int a[],int &sm,in

作业-----二维整型数组求最大最小值简单改进

1 public class Text1 2 { 3 public static void main(String[] args) 4 { 5 System.out.println("求数组中最大数跟最小数:a[][]={{3,2,6},{6,8,2,10},{5},{12,3,23}}"); 6 int[][] a={{3,2,6},{6,8,2,10},{5},{12,3,23}}; 7 int max=a[0][0]; 8 int min=a[0][0]; 9 for(int i

[OI - char]有关二维字符型数组的读入

有关二维字符型数组的读入 今天LYOI日常模拟赛 窝因为T3读入二维字符型数组时出了锅导致爆零qwq 步入正题 那么该如何读入二维的字符型数组呢 假设我们想读入n = 6的二维字符型数组 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; //#define DEBUG(x) cerr << #x &l

TP5.1查询二维数组中某个键值的所有和

$course_money=0; foreach($course_arr as $key => $v){ $course_money= $course_money + $v->money; } $course_arr 是从数据库中查询的多条数据:现目的是算出 多条数据中 money字段的总和:最终:$course_money 就是最终的总和! 原文地址:https://www.cnblogs.com/weilianguang/p/10984979.html

复习一下整型数组,字符数组,整型指针数组,字符指针数组,整型数组指针,字符数组指针

20:52:01 2019-12-31 整型数组 int a[10];字符数组 char b[10]; _______________________整型指针数组 int *p[10]; |__|__|__|__|__|__|__|__|__| 每个格子里存的是一个指针,每个指针都是int类型的,会指向一个int的值. 1 for(int i=0; i<10; i++) 2 p[i] = &a[i]; //把a中的每个元素的地址都放在了指针数组p里. 3 4 for(int j=0; j&l

编程之美-----在一个整型数组里找出只出现过一次的那两个数

一.一个数组里除了一个数字之外,其他的数字都出现了两次 用异或来解 #include <iostream> using namespace std; int main() { int T; int n,m; while(cin>>T,T){ cin>>n; while(--T){ cin>>m; n=m^n; } printf("%d\n",n); } return 0; } 扩展: 一个整型数组里除了两个数字之外,其他的数字都出现了两次

Java整型数组的最大长度到底有多长?

Java整型数组的最大长度到底有多长? 今天上网查了一下,各种说法都有,这个问题似乎总困扰我们Java初学者,无奈,只好自己试了一下,以下是我的测试代码,如果有错误,还望不吝赐教! 使用eclipse默认的vm arguments,运行以下代码: public static void main(String[] args) {byte[] array=new byte[61858764];// short[] shortArray=new short[30929382];// int[] int

不创建第三方变量对整型数组逆置

以整型数组为例实现逆置 将一个整型数组逆序,如:数组a[5]={1,2,3,4,5},逆序之后数组a的内容变成{5,4,3,2,1}. void SwapNum(int& a, int& b) {  a = a^b;  b = a^b;  a = a^b; } void SwapArray(int *str,int size) {  int i = 0;  for (i = 0; i < size / 2; i++)  {   SwapNum(str[i], str[size - i

华为机试—整型数组中出现次数最多的元素

取出整型数组中出现次数最多的元素,并按照升序排列返回. 要求实现方法: public static int[] calcTimes(int[] num, int len); [输入] num:整型数组: len :输入的整数个数 [返回] 按照升序排列返回整型数组中出现次数最多的元素 [注意]只需要完成该函数功能算法,中间不需要有任何IO的输入输出 示例 输入:num = {1,1,3,4,4,4,9,9,9,10} len = 10 返回:{4,9} #include <iostream>