问题:
难度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;
}
}