[Leetcode学习]Leftmost Column with at Least a One(最左存一列)

问题:

难度easy

说明:

给一个二维数组,里面都是0或者1,而且每一行都进行从小到大排序(左边0,右边1,但是每一列并没有排序,可能有的行1元素比较多),找到一个最左侧存在有1的列,然后返回它的索引(从0开始),没有返回 -1。

输入案例:

// 在列索引0,有1存在,返回1
Input: mat = [[0,0],
              [1,1]]
Output: 0

// 在列索引1,有1存在,返回1
Input: mat = [[0,0],
              [0,1]]
Output: 1

// 不存在列有1,返回-1
Input: mat = [[0,0],
              [0,0]]
Output: -1

我的代码:

写起来还是会有点啰嗦的,其实可以把他给的二维数组,画图看看

比如给了个这样的数组:

{{0 0 0 0 1 1 1}
{ 0 0 0 0 1 1 1} 
{ 0 0 0 0 0 0 1}
{ 0 0 1 1 1 1 1}
{ 0 0 0 1 1 1 1}}

然后画个图:

把这个数组转90°得:

这不就像是我们平时看的柱状图嘛,那我们要最左边的有1的列索引,我找一个四个角落得一个角落(我选择了数组最右下),只需要这样子查找:

就是沿着柱状的边找到一个最高的,我马上就知道第几列是最左的了。

再画一张明白点的是这样,沿着柱状的边走:

class Solution {
   public int leftMostColumnWithOne(BinaryMatrix binaryMatrix) {
        // 先拿个行列
        List<Integer> dim = binaryMatrix.dimensions();
        int rows = dim.get(0);
        int cols = dim.get(1);

        // 设置返回索引
        int index = -1;
        // 设置换行标记,用来判断换行了之后,是不是没碰到1
        boolean tF = true;

        // 我就直接把j放外面了,记录列的地方
        int j = cols;
        for(int i = rows;i -- > 0;) {
            for(;j -- > 0;) {
                int temp = binaryMatrix.get(i,j);
                if(temp == 0) {
                    // 如果换行没碰到1,就 + 1
                    if(tF) j ++;
                    // 碰到就 +2 因为j的遍历,我是先 -1
                    else j += 2;
                    break;
                } else {
                        index = j;
                        tF = false;
                }
            }
            tF = true;
        }

        return index;
    }
}

其他代码:

找到一个更简洁的,并不是指下面代码,写代码少确实简洁,不过不一定都得要少,如果我用链式编程+lamb表达式+语法糖这些不都全是一行代码,但效率不怎样。

class Solution {
    public int leftMostColumnWithOne(BinaryMatrix b) {
        List<Integer> dim = b.dimensions();
        // 我不习惯把两变量拍一块
        int width = dim.get(0), length = dim.get(1);
        int x = 0, y = length - 1;
        int ans = -1;
        while (x < width && y >= 0) {
            if (b.get(x, y) == 0)
                x++;
            else
                ans = y--;
        }
        return ans;
    }
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值