基础知识
Python中关于数组及len的操作详情可参考link,link。
二维数组中的查找
题目:
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
分析:
输入:二维数组array 整数 target
# -*- coding:utf-8 -*-
class Solution:
# array 二维列表
def Find(self, target, array):
# write code here
在进行作答时,已经创建好了类及输入的二维数组array及整数target,那么解题思路分析:
暴力方法:遍历二维数组每一个元素,最后找是否有该整数。
思路二:因为题目明确说了二维数组的每一行是从左到右递增,每一列从上到下递增,如果想减少暴力方法每个都遍历一次的次数,那么就需要利用到这种独特的递增顺序,遍历可以从左下角或者右上角开始遍历,从左下角开始,如果整数比他大,则向右移动(右边数组的数会增大),再次进行比较,如果整数比他小,则向上移动(上边数组的数会减小),就像猜数游戏一样,告诉你是大了还是小了,最后找到正确的数。
暴力法代码:
复杂度最高
# -*- coding:utf-8 -*-
class Solution:
# array 二维列表
def Find(self, target, array):
# write code here
if not array:
return
row=len(array) # 列[[1, 2, 3], [4, 5, 6]]
col=len(array[0]) # 行
for i in range(row):
for j in range(col):
if array[i][j]==target:
return True
return False
思路二代码:
每次从右和上选一个。
# -*- coding:utf-8 -*-
class Solution:
# array 二维列表
def Find(self, target, array):
# write code here
rows = len(array) - 1
cols= len(array[0]) - 1
i = rows
j = 0
while j<=cols and i>=0: # 在数组的边界内操作
if target<array[i][j]:
i -= 1
elif target>array[i][j]:
j += 1
else:
return True
return False
测试
以上代码均为写好的类,下面创建对象来测试代码:
# -*- coding:utf-8 -*-
class Solution:
# array 二维列表
def Find(self, target, array):
# write code here
rows = len(array) - 1
cols= len(array[0]) - 1
i = rows
j = 0
while j<=cols and i>=0:
if target<array[i][j]:
i -= 1
elif target>array[i][j]:
j += 1
else:
return print(True)
return print(False)
shuru = Solution() #创建对象1
shuru.Find(0, [[1, 2, 3], [3, 4, 9]]) # 调用对象功能
shuru1 = Solution() #创建对象2
shuru1.Find(2, [[1, 2, 3], [3, 4, 9]])
打印:
False
True
结果
比较一下两种方法的时间和内存
暴力方法:
思路二:
c++版本
class Solution {
public:
bool Find(int target, vector<vector<int> > array) {
// array是二维数组,这里没做判空操作
int rows = array.size();
int cols = array[0].size();
int i=rows-1,j=0;//左下角元素坐标
while(i>=0 && j<cols){//使其不超出数组范围
if(target<array[i][j])
i--;//查找的元素较少,往上找
else if(target>array[i][j])
j++;//查找元素较大,往右找
else
return true;//找到
}
return false;
}
};
结果:
竖起大拇指!
具体更多参考信息可以参考link。
刚开始学,Python基本的学完了,开始刷编程题。冲鸭!