剑指offer刷题笔记--题目11-20

news2025/1/7 18:47:48

1-旋转数组的最小数字(11)

 主要思路:

        一次旋转将最后一个元素移动最前面,由于数组最开始是升序的,因此数组的大部分元素都应该保持升序的状态(n1<n2<...<n3>n4<n5<...<n6);

        最后面开始遍历,只要遇到一个元素小于其前一个元素(numbers[i] < numbers[i - 1]),则numbers[i],就是最小的元素,因为前面的元素都是旋转移动过去的。

// 利用遍历
class Solution {
public:
    int minArray(vector<int>& numbers) {
        int size = numbers.size();
        for(int i = size - 1; i > 0; i--){
            if(numbers[i] < numbers[i - 1]){
                return numbers[i];
            }
        }
        return numbers[0];
    }
};
// 利用二分法
class Solution {
public:
    int minArray(vector<int>& numbers) {
        int low = 0;
        int high = numbers.size() - 1;
        while (low < high) {
            int pivot = low + (high - low) / 2;
            if (numbers[pivot] < numbers[high]) {
                high = pivot;
            }
            else if (numbers[pivot] > numbers[high]) {
                low = pivot + 1;
            }
            else {
                high -= 1;
            }
        }
        return numbers[low];
    }
};

2--矩阵中的路径(12)

视频讲解参考:剑指 Offer 12. 矩阵中的路径

主要思路:

        遍历 board 中的每一个位置,判断当前位置的元素是否与word[k]相同,并递归判断其上左下右四个元素是否与word[k+1]相同;如果word所有字符都匹配,则返回true,否则返回false并遍历board的下一个元素;

        ​​​​​​​为了防止重复访问元素,在判断一个位置上左下右四个元素时,将当前元素用特殊字符mask掉(当其被重复访问时,一定是返回false),避免其被重复访问;

代码:

#include <vector>
#include <string>
#include <iostream>

class Solution {
public:
    bool exist(std::vector<std::vector<char>>& board, std::string word) {
        for(int i = 0; i < board.size(); i++){
            for(int j = 0; j < board[0].size(); j++){
                if(dfs(board, word, i, j, 0)){ // 搜索每一个字符
                    return true;
                }
            }
        }
        return false;
    }
    bool dfs(std::vector<std::vector<char>>& board, std::string word, int i, int j, int k){
        // 判断是否越界、当前board[i][j]是否等于word[k]
        if(i >= board.size() || i < 0 || j >= board[0].size() || j < 0 || board[i][j] != word[k]){
            return false;
        }
        if (k == (word.length() - 1)){ // word的所有字符全部匹配成功
            return true;
        } 
        // 通过上面的if循环,可知当前board[i][j] == word[k]
        // 将当前 board[i][j] mask掉,防止被重复访问
        board[i][j] = '#';
        // 重复调用dfs,判断board[i][j]上左下右四个字符是否与word[k+1]相同
        bool result = dfs(board, word, i-1, j, k+1) || dfs(board, word, i, j-1, k+1)
        || dfs(board, word, i+1, j, k+1) || dfs(board, word, i, j+1, k+1);

        // 返回前,恢复mask掉的board[i][j]
        board[i][j] = word[k];
        return result;
    }
};

int main(int argc, char* argv[]){
    std::vector<std::vector<char>> board;
    std::vector<char> b0 = {'A', 'B', 'C', 'E'};
    std::vector<char> b1 = {'S', 'F', 'C', 'S'};
    std::vector<char> b2 = {'A', 'D', 'E', 'E'};
    board.push_back(b0);
    board.push_back(b1);
    board.push_back(b2);
    std::string word = "ABCCED";
    Solution s1;
    bool status = s1.exist(board, word);
    std::cout << status << std::endl;
    return 0;
}

3--机器人的运动范围

 主要思路:

        与《矩阵中的路径》类似,可利用深度优先递归判断每一个方格是否可跳,可跳条件是数位之和不大于 k;

        机器人的运动范围必须从(0, 0)开始,当访问某个可行方格后,可利用一个二维数组记录其已被访问,最后统计二维数组即可确定可访问的方格数;

        同时一个方格上、下、左、右移动可优化为只向右和向下移动,因为任何一个可跳方格都可以由上一个可行方格通过向右和向下移动得到,节省了递归四个方向的消耗(具体可看官方解释);

#include <vector>
#include <iostream>

class Solution {
public:
    int movingCount(int m, int n, int k) {
        for(int j = 0; j < n; j++){
            tmp.push_back(0);
        }
        for(int i = 0; i < m; i++){
            v.push_back(tmp);
        }
        DFS(0, 0, m, n, k);
        for(int i = 0; i < m; i++){
            for(int j = 0; j < n; j++){
                if(v[i][j] == 1){
                    num++;
                }
            }
        }
        return num;
    }

    void DFS(int i, int j, int m, int n, int k){
        // 越界、已访问
        if(i < 0 || i >= m || j < 0 || j >= n || v[i][j] == 1){
            return;
        }
        bool status = Cal_ij(i, j, k);
        if (status) v[i][j] = 1;
        else return; // 不能进入该点,也就不能从该点移动到其它四个点,直接返回
        // DFS(i-1, j, m, n, k);
        // DFS(i, j-1, m, n, k);
        DFS(i+1, j, m, n, k); // 向右移动
        DFS(i, j+1, m, n, k); // 向下移动
    }

    bool Cal_ij(int i, int j, int k){
        int sum = 0;
        sum += i % 10;
        i = i / 10;
        sum += i;
        
        sum += j % 10;
        j = j / 10;
        sum += j;

        if(sum > k) return false;
        else return true;
    }
private:
    std::vector<std::vector<int>> v; 
    std::vector<int> tmp;
    int num = 0;
};

int main(int argc, char *argv[]){
    int m = 16;
    int n = 8;
    int k = 4;
    Solution s1;
    int num = s1.movingCount(m, n, k);
    std::cout << "num is: " << num << std::endl;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/613498.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JAVA练习小游戏——贪吃蛇小游戏 PLUS版

目录 基础版本 新增内容 1.添加START开始界面 2.新增背景音乐 3.添加SCORE计分 4.新增游戏机制 代码实现 实机演示 基础版本 JAVA练习小游戏——贪吃蛇小游戏_timberman666的博客-CSDN博客https://blog.csdn.net/timberman666/article/details/131046742?spm1001.201…

xshell使用技巧小节

文章目录 1. 输出日志文件2. 快捷键设置3. 使用ctrlv按键4. 快速命令 1. 输出日志文件 需求&#xff1a;我们使用xshell时会经常需要把xshell中的内容打印到文件中&#xff0c;或者因为内容过多&#xff0c;xshell界面无法显示先显示出的内容&#xff0c;或者需要明确记录文件…

AlterNET Studio v9.0 Crack

AlterNET Studio v9.0 改进了代码编辑器、表单设计器和 Python LSP 解析器。 2023 年 6 月 5 日 - 11:22新版本 特征 代码编辑器 编辑器中添加了 Microsoft Visual Studio 主题。现在包括一个放大镜区域&#xff0c;可以更轻松地浏览文档的内容。带有 alpha 通道的图像现在用于…

汽车电子AUTOSAR之EcuM模块

目录 前言 正文 EcuM模块总体介绍 主要功能 总状态机&#xff08;Flexible 与 Fixed&#xff09; Startup Sequence STARTUP I STARTUP II RUN Sequence RUN II RUN III ShutDown Sequence ShutDown Target Go Sleep Go OFF I Go OFF II Sleep Sequence Sleep…

如何从平面图或蓝图为 ROS 创建地图

如何从平面图或蓝图为 ROS 创建地图 在本教程中&#xff0c;我将向您展示如何从平面图或蓝图为 RViz&#xff08;ROS 的 3D 可视化程序&#xff09;创建地图。为 RViz 创建地图是使机器人能够在环境中自主导航的重要步骤。 我们经常使用机器人的激光雷达来构建地图。这很好&am…

【openeuler】Yocto embedded sig例会 (2023-01-12)

Yocto & embedded sig例会 (2023-01-12)_哔哩哔哩_bilibili

群智能算法-模拟退火

一.基本理念 模拟退火算法(Simulated Annealing,简称SA) 的思想最早是由Metropolis等提出的.其出发点就是基于物理中固体物质的退火过程与一般的组合优化问题之间的相似性。模拟退火法是一种通用的优化算法&#xff0c;其物理退火过程由以下三部分组成。 加温过程&#xff1a;我…

AutoHand插件使用指南

一、设置 1.软件包设置 Auto Hand 包括四个内置的输入选项。AutoHand不直接管理输入,而是包含各种脚本,充当所选输入系统和Auto Hand之间的桥梁。 这里只介绍OpenXR(Action Based),首先作如下设置: 我这里用的是HTC Vive Pro: 找到并导入AutoHand插件中的OpenXR这个包:…

java错题记录(一)

一、观察下类代码&#xff0c;输出正确的是 String s1 "coder"; String s2 "coder"; String s3 "coder" s2; String s4 "coder" "coder"; String s5 s1 s2; System.out.println(s…

SELD2022:(一)数据集收集与组织详解

前言&#xff1a;声音事件检测与定位&#xff08;SELD&#xff09;作为DCASE挑战赛的子任务&#xff0c;从2019年开始已经举办了好几届。该子任务的目标也从2022年开始由原来的在仿真数据集上设计更优声学模型&#xff0c;过渡到了在真实数据集上进行模型优化。相对而言&#x…

Omnipeek 分析wifi包简单介绍

通常打开一个.pkt文件&#xff0c;我们先看到的是如下内容。 这个场景下的数据基本是不能分析的。。 因为抓空口包1分20秒基本有10w包了&#xff0c;所以通常会对所抓的空口包进行过滤然后分析。 写个例子&#xff1a; 我本次抓包的目的是看路由器mesh的wps 组网过程&#xf…

海睿思分享 | 低代码开发直面行业变革:革新,创新?

软件体系结构从单体集群服务时期&#xff0c;历经领域驱动设计、微服务架构等阶段&#xff0c;软件产品的开发过程的变革正在潜移默化地进行。 在软件逻辑架构设计、物理架构设计、构建与部署这一系列化的过程中&#xff0c;存在可缩减的设计与开发成本&#xff0c;曾经看似不可…

力扣高频SQL50题(基础版)——第六天

力扣高频SQL50题(基础版)——第六天 1 平均售价 1.1 题目内容 1.1.1 基本题目信息1 1.1.2 基本题目信息2 1.1.3 示例输入输出 1.2 示例sql语句 SELECT u.product_id,ROUND(SUM(p.price*u.units)/SUM(u.units),2) average_price FROM UnitsSold u INNER JOIN Prices p ON u.…

Linux :: 文件内容操作【6】:文件中指定中间部分(第多少行 到 第多少行)行内容输出 及 初步认识管道

前言&#xff1a;本篇是 Linux 基本操作篇章的内容&#xff01; 笔者使用的环境是基于腾讯云服务器&#xff1a;CentOS 7.6 64bit。 学习集&#xff1a; C 入门到入土&#xff01;&#xff01;&#xff01;学习合集Linux 从命令到网络再到内核&#xff01;学习合集 注&#xff…

OpenAI的人工智能语音识别模型Whisper详解及使用

1 whisper介绍 拥有ChatGPT语言模型的OpenAI公司&#xff0c;开源了 Whisper 自动语音识别系统&#xff0c;OpenAI 强调 Whisper 的语音识别能力已达到人类水准。 Whisper是一个通用的语音识别模型&#xff0c;它使用了大量的多语言和多任务的监督数据来训练&#xff0c;能够在…

Linux中使用ls命令按大小对所有文件进行排序

按大小列出目录中的文件(排序) ls -lSh

AI版女网红“半藏森林”上线,服务项目让人意想不到

目前首批网红明星“AI克隆人”已提前上线&#xff0c;主营业务就是打造各种名人版AI聊天机器人&#xff0c;用户付费便可与之聊天。其后台报名参加AI克隆人的网红明星“全网粉丝总数已超过5亿”。该公司这波上线的网红明星AI克隆人&#xff0c;包括此前因“疑似插足他人恋情”&…

腾讯工作3个月,做测试的一些感悟...

普通二本计算机专业毕业&#xff0c;从毕业后&#xff0c;第一份接触测试的工作是在一家通讯小公司&#xff0c;大部分接触的工作是以功能测试为主&#xff0c;一直都是几千块钱工资&#xff0c;还一度被派出差&#xff0c;以及兼职各种产品、运维、运营的活&#xff0c;感觉自…

TS学习操作

一.TypeScript环境安装与运行 1.全局安装 TypeScript &#xff1a; npm install -g typescript 2.校验 &#xff1a; tsc -v 二.如何运行 1.创建一个day01.ts文件夹 2.使用tsc ./day01.ts 将typescript代码转行成js代码 3.在html页面导入day01.js 4.创建配置文件 tsc --i…

力扣LeetCode算法题 第8题-字符串转换整数 (atoi)

以上为题目要求&#xff1a; /*** params Leetcode_test007* return Leetcode_test007* Author bigeZhong* disc**请你来实现一个myAtoi(string s)函数&#xff0c;使其能将字符串转换成一个 32 位有符号整数&#xff08;类似 C/C 中的 atoi 函数&#xff09;。** 函数myAtoi(…