算法思想一:暴力循环法
解题思路:
主要是对矩阵元素进行全部遍历查找目标值,采用双层遍历的方式
代码展示:
Python版本
class Solution:
def findElement(self, mat, n, m, x):
# write code here
res = []
# 特殊情况
if n == 0:
return res
# 两层遍历暴力搜索
for i in range(n):
for j in range(m):
# 搜索目标值,将坐标位置信息存入返回数组中
if mat[i][j] == x:
res.append(i)
res.append(j)
return res复杂度分析
时间复杂度:n,m表示矩阵的行列数量,双层遍历时间
空间复杂度:仅使用常数级变量空间,存储目标值索引数组
算法思想二:二分法
解题思路:
由题可知:行和列都是有序的,且元素互异,左下元素大于它上方的元素,小于它右方的元素,右上元素与之相反
因此可以采用二分法:
首先以左下角为起点,若是它小于目标元素,则往右移动去找大的,若是他大于目标元素,则往上移动去找小的。
图解:
代码展示:
import java.util.*;
public class Solution {
public int[] findElement(int[][] mat, int n, int m, int x) {
// write code here
// 初始化
int[] res = new int[2];
int i = n-1;
int j = 0;
// 循环结束条件
while (i >= 0 && j < m){
// 找到目标值返回目标的坐标
if (mat[i][j] == x){
res[0] = i;
res[1] = j;
return res;
// mat[i][j] > x 则将搜索位置向上移动一位
}else if(mat[i][j] > x){
i--;
}else{
// mat[i][j] < x 则将搜索位置向右移动一位
j++;
}
}
return res;
}
}复杂度分析
时间复杂度:n,m表示矩阵的行列数量,最多走过矩阵的两个边长
空间复杂度:仅使用常数级变量空间



京公网安备 11010502036488号