解題思路
先以單一個 row 來看,要怎麼找有幾個負數?
根據題目說明的特性,只要找到從哪裡開始都是負數的位置就好。那可以用 binary search。
譬如:[4,3,2,-1],最後 left 會停在 -1 的位置,那就可以算有幾個負數。
另外,因為下面的 row 肯定負數/正數的邊界只會越靠左,所以可以先存這邊以加快速度。
程式碼
class Solution {
public:
int helper(vector<vector<int>>& grid, int& right, int row)
{
int left = 0;
while(left <= right)
{
int mid = (left + right) / 2;
if(grid[row][mid] >= 0)
left++;
else
right--;
}
right = min(right, left);
return grid[row].size() - left;
}
int countNegatives(vector<vector<int>>& grid) {
int ans = 0, right = grid[0].size() - 1;
for(int i=0; i<grid.size(); i++)
{
ans += helper(grid, right, i);
}
return ans;
}
};
沒有留言:
張貼留言