这个题的解题思路,我个人就想到了两种
- 暴力
- 从左下找
- 我们不难发现,左下的元素(m)是这一行的最小值,这一列的最大值
- m < target 这m已经是这一行的最大值,所以我们需要右移一位
- m = target 直接返回 true
- m > target 这m已经是这一列最小的元素,所以我们需要向上移一行
Java
1、暴力
public class Solution {
public boolean Find(int target, int [][] array) {
for(int i = 0;i < array.length;i++)
{
for(int j = 0;j < array[0].length;j++){
if(array[i][j]==target)
{
return true;
}
}
}
return false;
}
}
2、从左下找
public class Solution {
public boolean Find(int target, int [][] array) {
int rows = array.length;
if(rows == 0)
return false;
int cols = array[0].length;
if(cols == 0)
return false;
int row = rows - 1;
int col = 0;
while(row>=0 && col<cols){
if(array[row][col]<target){
col++;
}else if(array [row][col]>target){
row--;
}else{
return true;
}
}
return false;
}
}
Python
1、暴力
# -*- coding:utf-8 -*-
class Solution:
# array 二维列表
def Find(self, target, array):
for i in range(len(array)):
for j in range(len(array[0])):
if array[i][j]==target:
return True;
return False;
# write code here
2、从左下找
class Solution:
# array 二维列表
def Find(self, target, array):
col = 0;
maxrow = len(array)-1;
row=maxrow;
maxcol = len(array[0])-1;
if maxrow == 0:
return False;
if maxcol ==0:
return false;
while row>=0 and col <= maxcol:
if(array[row][col]<target):
col+=1;
elif array[row][col]>target:
row-=1;
else:
return True;
return False;