刷题_day1_vv

来源:互联网 发布:在国外可以用淘宝吗 编辑:程序博客网 时间:2024/05/14 15:01
package com.vv;
/**
 * 题目描述:
 * 1. 一个二维数组,每一行从左到右递增,每一列从上到下递增
 *  2. 完成一个函数,输入这样的一个二维数组和一个数
 *  3. 判断数组中是否含有这个数
 *
 * @author vv 2016.4.5
 *
 * 常见错误思路分析:
 * 1. 选择比较数字的时候,犯了从数组中选择数字来进行比较
 * 2. 这种选择,导致要查找的数字,不仅可能在两个区域中出现,而且区域还有重叠
 * 3. 总的来说,就是剩下的查找区域非常不好,很不利于下次查找。
 *
 *  一种好的思路:
 *  1. 遇到这类问题我觉得下次应该想到从特殊点来出发,找规律
 *  2. 就像本题的点的选择,是在右上角或者左下角
 *  3. 尝试比较过后,发现每次都会排除一行或者一列,下个比较点还是区域的右上角或者左下角
 *
 * ps:
 * 本题是剑指offer第三题
 * 没有参考源C答案代码,java实现。
 *
 */
public class day1 {


public static void main(String[] args) {
// TODO Auto-generated method stub


int[][] a = { { 1, 2, 8, 9 }, { 2, 4, 9, 12 }, { 4, 7, 10, 13 },
{ 6, 8, 11, 15 }, { 7, 12, 20, 50 } };


for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
System.out.print(a[i][j] + " ");
}
System.out.println();
}


//测试用例
System.out.println(chazhao(a, 7));//true
System.out.println(chazhao(a, 50));//true
System.out.println(chazhao(a, 1));//true
System.out.println(chazhao(a, 60));//false
System.out.println(chazhao(a, 0));//false
System.out.println(chazhao(a, 39));//false
}


public static boolean chazhao(int[][] a, int x) {
// 从矩阵右上角开始
int raw = 0;
int col = a[0].length - 1;
// temp记录每次查找区域的右上角
int temp;
while (raw < a.length && col >= 0) {
temp = a[raw][col];
if (temp == x) {
return true;
} else if (temp > x) {
// 排除temp所在列
col--;
} else if (temp < x) {
// 排除temp所在行
raw++;
}
}
return false;
}
}
0 0