【持续跟新】剑指Offer_Java实现

开贴缘由

      老帖子了 ,但是我想换成macdown谁知道不能换,那就重新发布一个帖子吧
      我会继续更新的这一年太忙导致了这个帖子一直没有完成
      我会置顶,然后促使自己完成这60多道题目 其实我已经做完了一遍只是作为帖子 我会
      把我的思路都写上来

package sword_finger_offer;

import org.junit.jupiter.api.Test;

/**
 * 剑指offer习题一 二维数组中的查找
 * @ClassName: Code_00_topic01
 * @Description: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,
 * 每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组
 * 和一个整数,判断数组中是否含有该整数。
 * @author shundong.wu
 * @date 2019年2月19日
 *	
 */
public class Code_00_topic01 {
	/**
	 * 思路1: 二分查找每一行的数组  然后遍历列  
	 * 时间复杂度 O(nlogn)
	 * @param array 二位数组
	 * @param target 需要找的值
	 * @return
	 */
	@Test
	public boolean Find1(int[][] array,int target) {
		//外层的一维数组遍历
		for(int i=0;i<array.length;i++){
			//下面是二分
			int low=0;
			int high=array[i].length-1;
			while(low<=high){
				int mid=(low+high)/2;
				if(target>array[i][mid])
					low=mid+1;
				else if(target<array[i][mid])
					high=mid-1;
				else
					return true;
			}
		}
		return false;
	}

	/**
	 * 思路2: 首先矩阵是一个有规律的   
	 * 时间复杂度 O(M+N)
	 * 利用二维数组由上到下,由左到右递增的规律,
	 * 那么选取右上角或者左下角的元素a[row][col]与target进行比较,
	 * 当target小于元素a[row][col]时,那么target必定在元素a所在行的左边,
	 * 即col--;
	 * 当target大于元素a[row][col]时,那么target必定在元素a所在列的下边,
	 * 即row++
	 * @param array 二位数组
	 * @param target 需要找的值
	 * @return
	 */
	@Test
	public boolean Find2(int[][] array,int target) {
		int row = 0;//行
		int col =  array.length-1;//列
		//此处做越界处理  当行或者列越界 结束while循环
		while(row<=array.length-1&&col>=0){
			if(target==array[row][col])
				return true;
			else if(target>array[row][col])
				row++;
			else
				col--;
		}
		//若是遍历了整个矩阵 都没有 则返回false 结束该方法
		return false;
	}
}

原文地址:https://www.cnblogs.com/shundong106/p/13644704.html