9.11排序与查找(六)——给定M*N矩阵,每一行、每一列都按升序排列,找出某元素

/**

* 功能:给定M*N矩阵,每一行、每一列都按升序排列,找出某元素。

*/

两种方法:

方法一:

	/**
	 * 思路:若列的末端大于x,那么x位于该列的左边;若行的开头小于x,那么x位于列的下边。从矩阵中的子矩阵中查找元素。
	 * @param matrix
	 * @param elem
	 * @return
	 */
	public static boolean findElement(int[][] matrix,int elem){
		int row=0;
		int col=matrix[0].length-1;

		while(row<matrix.length&&col>=0){
			if(matrix[row][col]==elem)
				return true;
			else if(matrix[row][col]>elem)
				col--;
			else
				row++;
		}
		return false;
	}

方法二:

	/**
	 * 思路:由于每一个元素都大于它左边和上边的元素,所以,若在矩阵里任意画长方形,其右下角的元素一定是最大的,左上角的元素一定是最小的。
	 * 将矩阵分为四个区域,以递归方式搜索左下区域和右上区域。
	 * @param matrix
	 * @param elem
	 */
	public void findElement2(int[][] matrix,int elem){
		Coordinate origin=new Coordinate(0,0);
		Coordinate dest=new Coordinate(matrix.length-1,matrix[0].length-1);
		find(matrix, origin, dest, elem);
	}

	public Coordinate find(int[][] matrix,Coordinate origin,Coordinate dest,int x){
		if(!origin.inBounds(matrix)||!dest.inBounds(matrix))
			return null;

		if(matrix[origin.row][origin.column]==x)
			return origin;
		else if(!origin.isBefore(dest))
			return null;

		//start和end 分别设为对角线的起点和终点,矩阵不一定是正方形,因此对角线的终点也不一定是dest。
		Coordinate start=(Coordinate) origin.clone();
		int distance=Math.min(dest.row-origin.row, dest.column-origin.column);

		Coordinate end=new Coordinate(start.row+distance, start.column+distance);

		Coordinate p=new Coordinate(0,0);

		//在对角线上进行二分查找
		while(start.isBefore(end)){
			p.setToAverage(start, end);
			if(x>matrix[p.row][p.column]){
				start.row=p.row+1;
				start.column=p.column+1;
			}else{
				end.row=p.row-1;
				end.column=p.column-1;
			}
		}
		//将矩阵分为四个区域,搜索左下区域和右上区域
		return partitionAandSearch(matrix,origin,dest,start,x);

	}

	public Coordinate partitionAandSearch(int[][] matrix,Coordinate origin,Coordinate dest,Coordinate pivot,int elem){
		Coordinate lowerLeftOrigin=new Coordinate(pivot.row, origin.column);
		Coordinate lowerLeftDest=new Coordinate(dest.row,pivot.column-1);

		Coordinate upperRightOrigin=new Coordinate(origin.row,pivot.column);
		Coordinate upperRightDest=new Coordinate(pivot.row-1,dest.column);

		Coordinate lowerLeft=find(matrix, lowerLeftOrigin, lowerLeftDest, elem);
		if(lowerLeft==null)
			return find(matrix, upperRightOrigin, upperRightDest, elem);
		return lowerLeft;
	}

class Coordinate implements Cloneable{
	public int row;
	public int column;
	public Coordinate(int r,int c){
		this.row=c;
		this.column=c;
	}

	public boolean inBounds(int[][] matrix){
		return row>=0&&row<matrix.length&&column>=0&&column<matrix[0].length;
	}

	public boolean isBefore(Coordinate p){
		return this.row<=p.row&&this.column<=p.column;
	}

	public Object clone(){
		return new Coordinate(row,column);
	}

	public void setToAverage(Coordinate min,Coordinate max){
		row=(min.row+max.row)/2;
		column=(min.column+max.column)/2;
	}

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-07 08:45:10

9.11排序与查找(六)——给定M*N矩阵,每一行、每一列都按升序排列,找出某元素的相关文章

c程序设计 8.15写几个函数:①输个职工的姓名和职工号;②按职工号由小到大顺序排序,姓名顺序也随之调整;③要求输入一个职工号,用折半法找出该职工的姓名,从主函数输入要查找的职工号,输出该职工

8.15写几个函数:①输个职工的姓名和职工号:②按职工号由小到大顺序排序,姓名顺序也随之调整:③要求输入一个职工号,用折半法找出该职工的姓名, 从主函数输入要查找的职工号,输出该职工. 写的时候为方便输入,我设的是输入3名职工的信息. #define N 3 #include <stdio.h> #define N 3 #define LEN 20 //定义一个结构体类型 struct student{ char name[LEN]; int num; }; int main(){ int n

9.11排序与查找(五)——有个排序后的字符串数组,其中散布着一些空字符串,找出给定字符串的位置

/** * 功能:有个排序后的字符串数组,其中散布着一些空字符串,找出给定字符串的位置. */ /** * 思路:对二分查找法做修改,与mid比较的地方,如果mid为空字符串,则将mid换到离它最近的非空字符串的位置. * @param strings * @param str * @return */ public static int search(String[] strings,String str){ if(strings==null||str==null||str=="")

9.11排序与查找(三)——给定一个排序后的数组,包含n个整数,但这个数组已被旋转过多次,找出数组中的某个元素

/** * 功能:给定一个排序后的数组,包含n个整数,但这个数组已被旋转过多次,次数不详.找出数组中的某个元素. * 可以假定数组元素原先是按从小到大的顺序排列的. */ /** * 思路:数组被旋转过了,则寻找拐点. * @param a * @param left * @param right * @param x:要搜索的元素 * @return */ public static int search(int[] a,int left,int right,int x){ int mid=(

9.11排序与查找(一)——给定两个排序后的数组A和B,其中A的末端有足够的缓冲空间容纳B。将B合并入A并排序

/** * 功能:给定两个排序后的数组A和B,其中A的末端有足够的缓冲空间容纳B.将B合并入A并排序. */ /** * 问题:如果将元素插入数组A的前端,就必须将原有的元素向后移动,以腾出空间. * 思路:将元素插入数组A的末端. * * 注意:在处理完B的元素之后,不需要复制A的剩余元素,因为那些元素原本就在A中. * @param a * @param b * @param lastA * @param lastB */ public static void merge(int[] a,i

9.11排序与查找(二)——对字符串数组进行排序,将所有的变位词排在相邻的位置

/** * 功能:对字符串数组进行排序,将所有的变位词排在相邻的位置. */ 两种方法: 方法一: /** * 思路:套用排序算法,并修改比较器.这里比较器用来指示两个字符串胡伟变位词就是相等的. * @param array */ public static void sort(String[] array){ Arrays.sort(array, new AnagramComparator()); } class AnagramComparator implements Comparator

1.找出数组元素item在给定数组arr中的位置

var a=[1,5,'ff','g','h','sd']; alert(indexof(a,'g')); //3 function indexof(arr,item){ if (Array.prototype.indexOf) //判断Array原型中是否有此方法 { return arr.indexOf(item); } else{ for (var i=0;i<arr.length ;i++ ) { if(arr[i]==item){ return i } } } }

给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。

def strStr(haystack,needle): len1=len(needle) if len1==0: return 0 for i in range(len(haystack)): if haystack[i:i+len1]==needle: return i return -1 原文地址:https://www.cnblogs.com/zhangtianxia/p/9038426.html

排序与查找简单算法 java代码实现

最近整理了下以前的资料.有的算法没有实现,嘿嘿,以后再补吧! /** * 排序算法的分类如下:      * 1.插入排序(直接插入排序.折半插入排序.希尔排序):      * 2.交换排序(冒泡泡排序.快速排序):      * 3.选择排序(直接选择排序.堆排序):      * 4.归并排序:      *  关于排序方法的选择:      * (1)若n较小(如n≤50),可采用直接插入或直接选择排序.      *  当记录规模较小时,直接插入排序较好:否则因为直接选择移动的记录数少

二分查找---大于给定元素的最小元素

大于给定元素的最小元素 744. Find Smallest Letter Greater Than Target (Easy) Input: letters = ["c", "f", "j"] target = "d" Output: "f" Input: letters = ["c", "f", "j"] target = "k&qu