当前位置: 首页 > news >正文

【剑指offer】搜索算法

目录

📁 JZ53 数字在升序数组中出现的次数​编辑

📁 JZ4 二维数组中的查找​编辑

📁 JZ11 旋转数组的最小数字

📁 JZ38 字符串的排列​编辑


📁 JZ53 数字在升序数组中出现的次数

        这就是一道简单的模板题,使用二分查找的模板往上套即可。如果对二分还不是很熟悉的,可以看一下我写的这一篇文章,讲解的还是比较基础简单的:【算法杂货铺】二分算法_二分朴素-CSDN博客

#include <limits>
class Solution {
public:int GetNumberOfK(vector<int>& nums, int k) {if(nums.size() == 0)return 0;int left = 0, right = nums.size() - 1;int begin = -1 , end = -1;while(left < right){int mid = (left + right) >> 1;if(nums[mid] < k)left = mid + 1;elseright = mid;}if(nums[left] == k)begin = left;if(begin == -1)return 0;left = 0, right = nums.size() - 1;while(left < right){int mid = (left + right + 1) >> 1;if(nums[mid] > k)right = mid - 1;elseleft = mid;}if(nums[left] == k)end = left;return end - begin + 1;}
};

📁 JZ4 二维数组中的查找

        根据这个二维数组的性质,搜索目标数。

        "每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。"

        我们从左上角开始,面临如下几种情况:

1. target == 当前位置:直接返回true.

2. target > 当前位置:说明比当前行中的所有元素都要大,直接去下一行查找.

3. target < 当前位置:说明当前行可能存在目标元素,去前面的位置查找。因为列是从小到大向下递增的,如果当前行没有,要去下一行查找( target > 当前位置),在下一行中可以直接从当前行的列位置开始。

        行和列必须在指定范围内。

class Solution {
public:bool Find(int target, vector<vector<int> >& array) {int m = array.size(), n = array[0].size();if(m == 0 || n == 0)return false;int row = 0, col = n - 1;while(row < m && col >= 0){if(array[row][col] == target)return true;else if(array[row][col] > target)col--;else++row;}return false;}
};

📁 JZ11 旋转数组的最小数字

        旋转数组后,无非就下面这几种情况:

        将一个有序的数组分成一个或两个有序的数组。

1. mid > right:说明最小节点一定在mid的右侧.

2. mid == right: 不确定,逐渐缩小右边界范围.

3. mid < right: 最小节点一定在mid的左侧.

class Solution {
public:int minNumberInRotateArray(vector<int>& nums) {int l = 0, r = nums.size() - 1;while(l < r){int mid = (l + r) >> 1;if(nums[mid] > nums[r])l = mid + 1;else if(nums[mid] == nums[r])--r;elser = mid;}return nums[l];}
};

📁 JZ38 字符串的排列

        思路就是:将一个字符串str,生成其所有可能的排列(全排列),并返回去重后的结果。

#include <unordered_map>
#include <vector>
class Solution {
public:vector<string> ret;string path;unordered_set<string> s;vector<string> Permutation(string str) {int n = str.size();vector<bool> arr(n + 1 , false);dfs(str, arr);return ret;}void dfs(string str, vector<bool>& arr){if(path.size() == str.size() && s.find(path) == s.end()){ret.push_back(path);s.insert(path);return ;}for(int i = 0 ; i < str.size(); ++i){if(arr[i] == false){arr[i] = true;path += str[i];dfs(str, arr);arr[i] = false;path.pop_back();}}}
};
http://www.dtcms.com/a/329453.html

相关文章:

  • 力扣(跳跃游戏I/II)
  • c++26新功能—inplace_vector
  • 达梦数据库常见漏洞及处理方案
  • PostgreSQL——索引
  • TensorFlow实现回归分析详解
  • npm install 的作用
  • HTTP 请求转发与重定向详解及其应用(含 Java 示例)
  • Windows平台RTSP播放器选型与低延迟全解析及技术实践
  • 迅为RK3568开发板模型推理测试实战deeplabv3语义分割
  • Java基础 8.13
  • 【Flowable】工作流网关 控制流程的流向
  • 深度学习——03 神经网络(3)-网络优化方法
  • 门店销售机器人的智能升级:具身智能模型带来的变革
  • Mac安装ant
  • Linux性能分析教程:top, htop, iotop命令使用详解 (服务器慢/卡顿排查)
  • 电脑如何安装win10专业版_电脑用u盘安装win10专业版教程
  • GO学习记录四——读取excel完成数据库建表
  • 10.反射获取静态类的属性 C#例子 WPF例子
  • 5.0.9.1 C# wpf通过WindowsFormsHost嵌入windows media player(AxInterop.WMPLib)
  • BGE向量算法
  • C++冒泡、选择、快速、桶排序超超超详细解析
  • 20. 有效的括号 - 力扣(LeetCode)
  • P1886 滑动窗口 /【模板】单调队列【题解】
  • 《Foundations and Recent Trends in Multimodal Mobile Agents: A Survey》论文精读笔记
  • [量化交易](1获取加密货币的交易数据)
  • 面试实战 问题三十 HTTP协议中TCP三次握手与四次挥手详解
  • 解决程序连不上RabbitMQ:Attempting to connect to/access to vhost虚拟主机挂了的排错与恢复
  • 循序渐进学 Spring (上):从 IoC/DI 核心原理到 XML 配置实战
  • DataOceanAI Dolphin(ffmpeg音频转化教程) 多语言(中国方言)语音识别系统部署与应用指南
  • Vue 3 源码解读与核心 API 分析