0116 查找算法 Day5
创始人
2024-04-17 10:34:10
0

剑指 Offer 04. 二维数组中的查找

在一个 n * m 的二维数组中,每一行都按照从左到右 非递减 的顺序排序,每一列都按照从上到下 非递减 的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

示例:

现有矩阵 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。

给定 target = 20,返回 false。

class Solution {public boolean findNumberIn2DArray(int[][] matrix, int target) {}
}

解题思路

若使用暴力法遍历矩阵,未利用矩阵 “从上到下递增、从左到右递增” 的特点,显然不是最优解法。

如下图所示,我们将矩阵逆时针旋转 45° ,并将其转化为图形式,发现其类似于 二叉搜索树 

算法流程:
从矩阵 matrix 左下角元素(索引设为 (i, j) )开始遍历,并与目标值对比:
当 matrix[i][j] > target 时,执行 i-- ,即消去第 i 行元素;
当 matrix[i][j] < target 时,执行 j++ ,即消去第 j 列元素;
当 matrix[i][j] = target 时,返回 true ,代表找到目标值。
若行索引或列索引越界,则代表矩阵中无目标值,返回 false 。
每轮 i 或 j 移动后,相当于生成了“消去一行(列)的新矩阵”, 索引(i,j) 指向新矩阵的左下角元素(标志数),因此可重复使用以上性质消去行(列)。

 

 

 

 

 

代码如下:


class Solution {public boolean findNumberIn2DArray(int[][] matrix, int target) {int i = matrix.length - 1, j = 0;while(i >= 0 && j < matrix[0].length){if(matrix[i][j] > target) i--;else if(matrix[i][j] < target) j++;else return true;}return false;}

剑指 Offer 11. 旋转数组的最小数字 

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。

给你一个可能存在 重复 元素值的数组 numbers ,它原来是一个升序排列的数组,并按上述情形进行了一次旋转。请返回旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一次旋转,该数组的最小值为 1。  

示例 1:

输入:numbers = [3,4,5,1,2]
输出:1
示例 2:

输入:numbers = [2,2,2,0,1]
输出:0

class Solution {public int minArray(int[] numbers) {}
}

解题思路 

算法流程:
初始化: 声明 i, j 双指针分别指向 nums 数组左右两端;
循环二分: 设 m = (i + j) / 2 为每次二分的中点,可分为以下三种情况:
当 nums[m] > nums[j]时: m 一定在 左排序数组 中,即旋转点 x 一定在 [m + 1, j] 闭区间内,因此执行i=m+1;
当nums[m] 当 nums[m]=nums[j] 时: 无法判断 m 在哪个排序数组中,即无法判断旋转点 x 在[i,m] 还是 [m+1,j] 区间中。解决方案: 执行j=j−1 缩小判断范围
返回值: 当 i=j 时跳出二分循环,并返回 旋转点的值nums[i] 即可。

 

 

 

 

 

 

代码如下:

class Solution {public int minArray(int[] numbers) {int i = 0, j = numbers.length - 1;while (i < j) {int m = (i + j) / 2;if (numbers[m] > numbers[j]) i = m + 1;else if (numbers[m] < numbers[j]) j = m;else j--;}return numbers[i];}
}

剑指 Offer 50. 第一个只出现一次的字符 

在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。

示例 1:

输入:s = "abaccdeff"
输出:'b'
示例 2:

输入:s = "" 
输出:' '

class Solution {public char firstUniqChar(String s) {}
}

解题思路 

 

 

 

 

 

 

 

 

 

 

 

代码如下:

class Solution {public char firstUniqChar(String s) {HashMap dic = new HashMap<>();char[] sc = s.toCharArray();for(char c : sc)dic.put(c, !dic.containsKey(c));for(char c : sc)if(dic.get(c)) return c;return ' ';}
}

 

 

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
【PdgCntEditor】解... 一、问题背景 大部分的图书对应的PDF,目录中的页码并非PDF中直接索引的页码...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...
有效的括号 一、题目 给定一个只包括 '(',')','{','}'...