今天在Youtube上看到这么一道题, 我之前肯定是有见过的,但是忘了是怎么做的。
Count Negative Integers
Array is sorted.
例子:
[-3, -2, -1, 1] -->3
[-2, 2, ,3,, 4] -->1
[4, 5 , 7, 8] -->0
一共4 个。
O(nm) is naive solution
最暴力的解法就是整个matrix走一遍,看看一共几个non-negative numbers.
注意Each row/col is sorted.
我本来的优化想法是每一行横着走,看到第一个non-negative 停下来去下一行。但是这个做法没有利用到col sorted 的用处。
视频里的solution是从第一行的最后一个元素开始走,直到碰到倒数第一个negative number.这时候,马上切换到下一行。如果这个数字是个负数,继续切换到下一行,知道col上我们到达一个non-negative number,这时候再往左边开始走。 这个解法的核心是,由于matrix已经排序好了,所以在row上,碰到了倒数第一个negative后,我们知道这个数的左边全部是negative,不用再看了。 在col上,碰到第一个non-negative后,我们知道col再往下同一个col不会再出现negative了,这个时候就应该往左开始走。【*注: 我们往next-col走的前提是,我们在这个row发现了第一个negative number, 这样我们既可以添加上 这一行的negative 数量, 又可以跳到下一行。 如果row上连第一个negative number都没找到,我们立刻就到下一个col也没什么意义,因为下一个col这个位置由于sort也是正数】
count = col+1 这个太恐怖了。。。我本来还想拿col 去减left most col. 但是这特么不就是col-0+1=col+1吗。。
知道了算法,大部分人也许还是会写一个double loop。但是optimal应该用一个loop就可以解决。