算法思想一:暴力循环法
解题思路:
主要是对矩阵元素进行全部遍历查找目标值,采用双层遍历的方式
代码展示:
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表示矩阵的行列数量,最多走过矩阵的两个边长
空间复杂度:仅使用常数级变量空间