赞
踩
编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:
每行的元素从左到右升序排列。
每列的元素从上到下升序排列。
输入:matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 5
输出:true
输入:matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 20
输出:false
m == matrix.length
n == matrix[i].length
1 <= n, m <= 300
-10^ 9<= matrix[i][j] <= 10^9
每行的所有元素从左到右升序排列 每列的所有元素从上到下升序排列
-10^ 9 <= target <= 10^9
class Solution { public: /**思路一:直接遍历查找;时间复杂度O(nm),超出限制*/ /* bool searchMatrix(vector<vector<int>>& matrix, int target) { for(int i=0;i<matrix.size();i++){ for(int j=0;j<matrix[0].size();j++){ if(target==matrix[i][j]){ return true; } } } return false; } */ /**思路二:由于每一行都是升序,所以每一行都可以用可用二分查找;时间复杂度O(mlogn)*/ /* bool searchMatrix(vector<vector<int>>& matrix, int target) { for(int i=0;i<matrix.size();i++){ if(binarySearch(matrix[i],target,0,matrix[0].size()-1)){ return true; } } return false; } bool binarySearch(vector<int>& nums,int target,int left,int right){ if(left>right){ return false; } if(left==right){ if(nums[left]==target){ return true; } return false; } int mid=(left+right)/2; if(nums[mid]>target){ return binarySearch(nums,target,left,mid); } else if (nums[mid]==target){ return true; } else{ return binarySearch(nums,target,mid+1,right); } } */ /**思路三:Z字查找:从右上角[0][n-1]开始查找,如果>target向左一列;如果<target向下一行*/ bool searchMatrix(vector<vector<int>>& matrix, int target) { int i=0; int j=matrix[0].size()-1; while(i<matrix.size() && j>=0){ if(matrix[i][j]>target){ j--; } else if (matrix[i][j]==target){ return true; } else{ i++; } } return false; } };
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。