行列均递增的二维数组中查找元素

2024-06-06 21:48

本文主要是介绍行列均递增的二维数组中查找元素,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

剑指offer中的一个原题:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序,

输入一个二维数组和一个数,判断该数组中是否有该数。

解决思路:每次从二维数组的右上角作为查找起始点,如果右上角元素大于目标值,则把查找点所在的列排除,如果右上角元素

小于目标值则把查找点所在的行排除,如果右上角元素等于目标值则返回true;在新的查找区域中将右上角元素再作为查找点继续循环

以上操作。

优化思路:例如一下二维数组:

1    3 5 7 9 10 11 14 
12 14 16 18 19 20 22 24

在其中查找元素16,则按照上述的解决思路在查找区域将会变成一个一维数组12 14 16 18 19 20 22 24,从而在该一维数组中遍历

查找元素16,效率依然会很低,所以优化思路是:如果查找区域最后变成一个一维数组时(可能是二维数组中的最后一行或者是第一列),

应该此时采样折半查找。

import java.util.Scanner;public class Main{public static void main(String args[]){Scanner sc = new Scanner(System.in);int m = sc.nextInt();//行数int n = sc.nextInt();//列数int arr[][] = new int[m][n];for(int i = 0;i<m;i++){for(int j = 0;j<n;j++){arr[i][j] = sc.nextInt();}}int targetValue = sc.nextInt();System.out.println(MulArrayFind(arr,targetValue));}//方法public static boolean MulArrayFind(int[][] arr,int targetValue){//右上角的坐标int topRightCornerX = 0;int topRightCornerY = arr[0].length-1;while( topRightCornerX < arr.length && topRightCornerY >=0){if(arr[topRightCornerX][topRightCornerY]==targetValue){System.out.println("OK1");return true;}if(arr[topRightCornerX][topRightCornerY]>targetValue){topRightCornerY--;}else{topRightCornerX++;}//优化对于最后在单行或者单列中进行搜索时,采用二分查找进行搜索if(topRightCornerX==arr.length-1 ){//最后一行进行二分查找int begin = 0,end = topRightCornerY;while(begin<=end){int mid = (begin+end)/2;if(arr[topRightCornerX][mid] == targetValue){System.out.println("OK2");return true;}if(arr[topRightCornerX][mid] < targetValue){begin = mid+1;}else{end = mid-1;}}return false;}if(topRightCornerY==0){//第一列进行二分查找int begin = topRightCornerX,end = arr.length-1;while(begin <= end){int mid = (begin+end)/2;if(arr[mid][0] == targetValue){System.out.println("OK3");return true;}if(arr[mid][0] < targetValue){begin = mid+1;}else{end = mid-1;}}return false;}}return false;}
}



这篇关于行列均递增的二维数组中查找元素的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1037321

相关文章

关于最长递增子序列问题概述

《关于最长递增子序列问题概述》本文详细介绍了最长递增子序列问题的定义及两种优化解法:贪心+二分查找和动态规划+状态压缩,贪心+二分查找时间复杂度为O(nlogn),通过维护一个有序的“尾巴”数组来高效... 一、最长递增子序列问题概述1. 问题定义给定一个整数序列,例如 nums = [10, 9, 2

CSS3中使用flex和grid实现等高元素布局的示例代码

《CSS3中使用flex和grid实现等高元素布局的示例代码》:本文主要介绍了使用CSS3中的Flexbox和Grid布局实现等高元素布局的方法,通过简单的两列实现、每行放置3列以及全部代码的展示,展示了这两种布局方式的实现细节和效果,详细内容请阅读本文,希望能对你有所帮助... 过往的实现方法是使用浮动加

使用Python合并 Excel单元格指定行列或单元格范围

《使用Python合并Excel单元格指定行列或单元格范围》合并Excel单元格是Excel数据处理和表格设计中的一项常用操作,本文将介绍如何通过Python合并Excel中的指定行列或单... 目录python Excel库安装Python合并Excel 中的指定行Python合并Excel 中的指定列P

Java 字符数组转字符串的常用方法

《Java字符数组转字符串的常用方法》文章总结了在Java中将字符数组转换为字符串的几种常用方法,包括使用String构造函数、String.valueOf()方法、StringBuilder以及A... 目录1. 使用String构造函数1.1 基本转换方法1.2 注意事项2. 使用String.valu

在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码

《在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码》在MyBatis的XML映射文件中,trim元素用于动态添加SQL语句的一部分,处理前缀、后缀及多余的逗号或连接符,示... 在MyBATis的XML映射文件中,<trim>元素用于动态地添加SQL语句的一部分,例如SET或W

MYSQL行列转置方式

《MYSQL行列转置方式》本文介绍了如何使用MySQL和Navicat进行列转行操作,首先,创建了一个名为`grade`的表,并插入多条数据,然后,通过修改查询SQL语句,使用`CASE`和`IF`函... 目录mysql行列转置开始列转行之前的准备下面开始步入正题总结MYSQL行列转置环境准备:mysq

JAVA中整型数组、字符串数组、整型数和字符串 的创建与转换的方法

《JAVA中整型数组、字符串数组、整型数和字符串的创建与转换的方法》本文介绍了Java中字符串、字符数组和整型数组的创建方法,以及它们之间的转换方法,还详细讲解了字符串中的一些常用方法,如index... 目录一、字符串、字符数组和整型数组的创建1、字符串的创建方法1.1 通过引用字符数组来创建字符串1.2

vue如何监听对象或者数组某个属性的变化详解

《vue如何监听对象或者数组某个属性的变化详解》这篇文章主要给大家介绍了关于vue如何监听对象或者数组某个属性的变化,在Vue.js中可以通过watch监听属性变化并动态修改其他属性的值,watch通... 目录前言用watch监听深度监听使用计算属性watch和计算属性的区别在vue 3中使用watchE

poj2576(二维背包)

题意:n个人分成两组,两组人数只差小于1 , 并且体重只差最小 对于人数要求恰好装满,对于体重要求尽量多,一开始没做出来,看了下解题,按照自己的感觉写,然后a了 状态转移方程:dp[i][j] = max(dp[i][j],dp[i-1][j-c[k]]+c[k]);其中i表示人数,j表示背包容量,k表示输入的体重的 代码如下: #include<iostream>#include<

hdu2159(二维背包)

这是我的第一道二维背包题,没想到自己一下子就A了,但是代码写的比较乱,下面的代码是我有重新修改的 状态转移:dp[i][j] = max(dp[i][j], dp[i-1][j-c[z]]+v[z]); 其中dp[i][j]表示,打了i个怪物,消耗j的耐力值,所得到的最大经验值 代码如下: #include<iostream>#include<algorithm>#include<