Rhyme/剑指Offer Java 01

23 篇文章 0 订阅
7 篇文章 0 订阅

剑指Offer Java 01

package offer1;


/**
 * 在一个二维数组中,
 * 每一行从左到右递增,
 * 每一列从上到下递增,
 * 试求数组中是否存在数x
 *
 * @author RhymeChiang
 * @date 2018/01/13
 **/
public class Offer01 {
    /**
     * 判断数组中是否存在数target
     * <p>
     * 查找思路:
     * 1    2   3   4
     * 2    3   4   5
     * 3    4   5   6
     * 4    5   6   7
     * 从左下角开始,
     * 若target比当前数大则向右,
     * 若target比当前数小则向上
     *
     * @param array  源数组
     * @param target 目标值
     * @return
     */
    public static boolean find(int[][] array, int target) {
        //  或取当前二维数组的深度
        int arrayDepth = array.length - 1;
        //  x 代表当前候选值的横坐标
        int x = 0;
        //  y 代表当前候选值的纵坐标
        int y = arrayDepth;
        //  currentNum 代表当前y行x列的候选数
        int currentNum = array[y][x];
        //  当遍历完所有的行查找结束
        //  当遍历完当前行查找结束
        while (y >= 0 && x < array[y].length) {
            //  匹配成功
            if (currentNum == target) {
                System.out.println(target+" 位于 [ " + (y+1) + "行" + ",  " + (x+1) + "列 ]");
                return true;
            }
            //  目标值大于当前值-->右移
            if (target > currentNum) {
                currentNum = array[y][++x];
                continue;
            }
            //  目标值小于当前值,上移
            if (target < currentNum) {
                currentNum = array[--y][x];
            }
        }
        return false;
    }

    public static void main(String[] args) {
        int[][] array = {
                {1, 2, 3, 4},
                {2, 3, 4, 5},
                {3, 4, 5, 6},
                {4, 5, 6, 7}
        };
        System.out.println("源数组:");
        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array[i].length; j++) {
                System.out.print(array[i][j]+"\t");
            }
            System.out.println();
        }
        int target = 5;
        System.out.println("目标值:"+target);
        System.out.println(find(array, target));

        target = 4;
        System.out.println("目标值:"+target);
        System.out.println(find(array, target));

        target = 6;
        System.out.println("目标值:"+target);
        System.out.println(find(array, target));

        target = 3;
        System.out.println("目标值:"+target);
        System.out.println(find(array, target));


        target = 2;
        System.out.println("目标值:"+target);
        System.out.println(find(array, target));
    }
}

运行结果:

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值