网站与平台的开发区别网站备案 接电话
网站与平台的开发区别,网站备案 接电话,谷歌浏览器网页截图快捷键,广告网站策划方案目录 题目解题思路具体代码题目 题目链接剑指offer#xff1a;二维数组中的查找题目描述 在一个二维数组中#xff08;每个一维数组的长度相同#xff09;#xff0c;每一行都按照从左到右递增的顺序排序#xff0c;每一列都按照从上到下递增的顺序排序。请完成一个函数二维数组中的查找题目描述 在一个二维数组中每个一维数组的长度相同每一行都按照从左到右递增的顺序排序每一列都按照从上到下递增的顺序排序。请完成一个函数输入这样的一个二维数组和一个整数判断数组中是否含有该整数。 解题思路 这题解题的关键在于数据是有序的很自然的便想到使用二分法在提交后在评论区发现了更优的解法除了数据有序外利用了数据按矩阵形式排列这一特点会在下列代码中给出。 在使用二分法时值得注意的是不能将二维数组中所有元素看作单调递增排列的一维数组从而对所有元素整体进行二分。题目仅说明数据在矩阵的每行每列各自具单调递增的性质而行或列之间并没有确定的大小关系。例如第一行可能是[4, 5, 6], 而第二行为[1, 2, 3]第二行元素可能小于第一行元素。 具体代码 1. 二分法 因为只能逐行进行二分故算法时间复杂度为O(nlogm)n为矩阵行数m为列数。 计算二分的中值mid时推荐使用mid (right - left) / 2 left而不是mid (left right) / 2 这样能够避免加法溢出 class Solution {
public:bool Find(int target, vectorvectorint array) {// 求出矩阵行数row和列数colint row array.size();int col array[0].size();int left;int right;int mid;// 对数组逐行进行二分查找for (int i 0; i row; i) {left 0;right col - 1;while (right left) {mid (right - left) / 2 left; // 防止leftright导致加法溢出if (array[i][mid] target) {left mid 1;} else if (array[i][mid] target) {right mid - 1;} else {return true;}}}return false;}
}; 2. 利用元素特殊的排列 利用元素排列的性质对于左下角的元素来说其同列上方的元素一定是小于它其同行右方的元素一定是大于它能够在推导的过程中跳过更多的错误元素。易知算法时间复杂度为O(nm) class Solution {
public:bool Find(int target, vectorvectorint array) {// 求出矩阵行数row和列数colint row array.size();int col array[0].size();// 初始从矩阵左下方开始查找for (int i row - 1, j 0; i 0 j col; ) {// 分三种情况// 1. 当前位置元素大于目标位置元素位置上移一行(i--)// 2. 当前位置元素小于目标位置元素位置右移一列(j)// 3. 当前位置元素等于目标位置元素已找到返回trueif (target array[i][j]) {i--;} else if (target array[i][j]) {j;} else {return true;}}return false;}
};转载于:https://www.cnblogs.com/Bylight/p/10440681.html
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/88357.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!