算法题之二维数组中的查找-第一天(2019/5/29)

29 篇文章 0 订阅

题目描述

在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数

思路:
二维数组是有序的,从右上角来看,向左数字递减,向下数字递增。
因此从右上角开始查找,当要查找数字比右上角数字大时,下移;
当要查找数字比右上角数字小时,左移;如果出了边界,则说明二维数组中不存在该整数。
代码:(给出两种方法)

public class 二维数组中的查找 {
	public static void main(String[] args) {
		int [][]num = {{1,2,3},{4,5,6},{7,8,9}};
		int x = 5 ;
		findNum(num, x);
		System.out.println(findNum2(x, num));
	}
	/**
	 * 第一种方法
	 * @param num 数组
	 * @param x 整数
	 */
	public static void findNum(int[][] num,int x){
		if(num.length <= 0 || num[0].length <= 0 ){
			return ;
		}
		int rLen = num.length - 1;
		int c = num[0].length - 1 ;
		int r = 0 ;
		while( r <= rLen && c >= 0){
			if(num[r][c] > x){
				c --;
			}else if(num[r][c] < x){
				r ++;
			}else if(num[r][c] == x){
				System.out.println(x+"存在");
				break;
			}else{
				System.out.println("二维数组不存在"+x);
			}
		}
		
		
	}
	/**
	 * 第二中方法
	 */
	public static boolean findNum2(int target,int[][] num){
		if(num.length == 0 || num[0].length == 0){
			return false;
		}
		/**
		 * 定义行和列,从最右边开始扫描
		 */
		int r = 0 ;
		int c = num[0].length - 1 ;
		int temp = num[r][c];//临时变量,保存当前的值,进行和整数比较
		while(target != temp){
			if(c >= 0 && r < num.length){
				if(num[r][c] > target){
					c --;
				}else if(num[r][c] < target){
					r ++;
				}
				temp = num[r][c] ;
			}else{
				return false;
			}
		}
		return false ;
		
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第一章概论 自测答案 一、填空 1. 数据结构是一门研究非数值计算的程序设计问计算机的 操作对象 以及它们之间的 关系 和运算等的学科。 2. 数据结构被形式地定义为(D, R),其D是 数据元素 的有限集合,R是D上的 关系 有限集合。 3. 数据结构包括数据的 逻辑结构 、数据的 存储结构 和数据的 运算 这三个方面的内容。 4. 数据结构按逻辑结构可分为两大类,它们分别是 线性结构 和 非线性结构 。 ....... 第2章 自测卷答案 一、填空 1. 【严集2.2①】在顺序表插入或删除一个元素,需要平均移动 表一半元素,具体移动的元素个数与 表长和该元素在表的位置 有关。 2. 线性表结点的集合是 有限 的,结点间的关系是 一对一 的。 3. 向一个长度为n的向量的第i个元素(1≤i≤n+1)之前插入一个元素时,需向后移动 n-i+1 个元素。 4. 向一个长度为n的向量删除第i个元素(1≤i≤n)时,需向前移动 n-i 个元素。 5. 在顺序表访问任意一结点的时间复杂度均为 O(1) ,因此,顺序表也称为 随机存取 的数据结构。 ....... 第8章 查找 自测卷 姓名 班级 一、填空(每空1分,共10分) 1. 在数据的存放无规律而言的线性表进行检索的最佳方法是 顺序查找(线性查找) 2. 线性有序表(a1,a2,a3,…,a256)是从小到大排列的,对一个给定的值k,用二分法检索表与k相等的元素,在查找不成功的情况下,最多需要检索 8 次。设有100个结点,用二分法查找时,最大比较次数是 7 。 3. 假设在有序线性表a[20]上进行折半查找,则比较一次查找成功的结点数为1;比较两次查找成功的结点数为 2 ;比较四次查找成功的结点数为 8 ;平均查找长度为 3.7 。解: 显然,平均查找长度= O(log 2 n) <5次(2 5 )。但具体是多少次,则不应当按照公式来计算( 即( 21×log 2 21)/20=4.6次并不正确! )。因为这是在假设 n=2 m -1的情况下推导出来的公式。应当用穷举法罗列全部元素的查找次数为=( 1+2×2+4×3+8×4+5×5)=74; ASL=74/20=3.7 !!! 4. 折半查找有序表(4,6,12,20,28,38,50,70,88,100),若查找元素20,它将依次与表元素 28. 6. 12 .20 比较大小。 .........
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值