剑指offer经典题型(一)

news2025/4/6 6:23:11

        本期我们将开始进行剑指offer中经典题型的学习。

数组相关

        题目1:在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。OJ地址

        分析:所有的查找本质上就是一个排除的过程,一次排除的无效元素越多,查找的效率就越高。 

        解题思路:二维矩阵的右上角的元素,一定是它所处的行中最大的元素,所处的列中最小的元素。 以右上角的元素为基准,依次与此元素进行比较,比当前元素小就在当前元素的左侧进行查找,比当前元素大就在当前元素的下侧进行查找。多次的查找就是一个循环,所以需要以行标和列标作为循环的终止条件。通过上述查找方式,一次可以排除一行或者一列,所以效率也是很高的。

        代码如下。

class Solution {
public:

    bool Find(int target, vector<vector<int> >& array) {
        //i表示二维数组的行标,由最外层的vector对象array的元素的个数size()决定
        int i=0;
        //j表示二维数组的列标,由里层的每个vector对象的元素的个数size()决定
        int j=array[0].size()-1;
        while(i<array.size()&&j>=0)
        {
            if(target<array[i][j])
            {
                j--;
            }
            else if(target>array[i][j])
            {
                i++;
            }
            else {
                return true;
            }
        }
        return false;

        
    }
};

        题目2: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。oj地址

        解题思路: 一个非递减的数组在进行了旋转之后,一定一定一定会被分成左右两个非递增的数据,且左边的递增数组的所有元素的值一定是 >= 右边递增数组的所有元素的。且旋转的数组的最小值一定就是首次出现递减的时候的最小值。那么怎样才能知道首次递减呢,我们可以通过二分查找的方式,每次确定一个mid,然后一次比较mid和left的值,如果mid的值比left的值大或者相等,那么mid一定在左侧的非递减序列中,那么最小的值一定在mid的右侧,所以此时就要调整left的值为mid的值,即left右移;如果mid的值比左侧的值小,那么mid一定处于右侧的非递减序列,那么最小的值一定是在mid的左侧的,或者mid就是最小值,所以此时我们就要调整right的值为mid的值,即right左移。当left和right相邻时,right的值就是最大值。

        特殊情况:当这个数组的每个元素都是相等的时候,也就是无法通过mid与left或者right的值去判断,最小的值在mid的左侧或者右侧时,此时就要现行便利旋转之后的数组去查询最小值。

        代码如下。

class Solution {
public:
   
    int minNumberInRotateArray(vector<int>& nums) 
    {
        //如果nums的size为0,则直接返回0
        if(nums.size()==0){
            return 0;
        }
        int left=0;
        int right=nums.size()-1;
        //旋转数组的条件就是left的值比right的值大
        while(nums[left]>=nums[right])
        {
            int mid=(left+right)/2;
            //right和left相邻时,right对应的值就是最小值
            if(right-left==1)
            {

                return nums[right];
            }

            //如果通过mid与left或者right比较之后确定最小值的位置,则要通过线性遍历,确定最小值
            if(nums[left]==nums[mid]&&nums[mid]==nums[right])
            {
                int result=nums[left];
                for(int i=1;i<nums.size();i++)
                {
                    if(result>nums[i])
                    {
                        result=nums[i];
                    }
                }

                return result;
            }

            //如果mid的值大于left,证明最小的值在mid右侧,右移left
            if(nums[mid]>=nums[left])
            {
                     left=mid;
            }
            //如果mid的值小于left,证明最小的值在mid左侧,左移right
            else 
            {
                     right=mid;
               
            }
            
        }
            return nums[left];
    }
};

        题目3: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。

        解析:如上图要实现奇数位于数组的前半部分,偶数位于数组的后半部分,其实就是不断的将偶数往后移动,从而空出对应的位置,然后将奇数插入偶数的位置,前提是要先使用中间变量保存奇数的值。同时,如果一个奇数已经确定了位置,那么后续这个奇数就不能再被交换,因为要保证奇数的位置不变。 

        代码如下。

#include<iostream>
using namespace std;

void show(int *a,int num)
{
	for (int i = 0; i < num; i++)
	{
		cout << a[i] << " ";
	}
}



void Sort(int* a,int num)
{
	//保存已经排好的奇数的位置
	int k = 0;
	int j = 0;
	for (int i = 0; i < num; i++)
	{
		//判断当前元素是否为奇数
		if (a[i] & 1)
		{
			int tmp = a[i];
			j = i;
			//向后移动偶数数的位置
			while (j > k)
			{
				a[j--] = a[j - 1];
			}
			//将奇数放到合适的位置
			a[k++] = tmp;
		}

	}

}

int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int num = sizeof(arr) / sizeof(int);
	show(arr,num);
	Sort(arr,num);
	cout << endl;
	show(arr, num);


}

        运行结果如下。

        运行结果符合预期。 

         题目4:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组 {1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。OJ地址

        解析:这个题目相对简单,可以使用C++库中的uordered_map的[]特性,以为unordered_map的[],里面其实本质上就是元素的插入,如果当前元素存在就返回已经存在的元素的second,如果不存在就返回新插入的元素的second。用这一特性实现数字个数的统计。 

        代码如下。

#include <unordered_map>
class Solution {
public:

    int MoreThanHalfNum_Solution(vector<int>& numbers) {
        // write code here
        unordered_map<int,int> _map;
        for(auto e:numbers)
        {
            _map[e]++;
        }
        int length=numbers.size()/2;
        for(auto e:_map)
        {
            //不用考虑数组长度/2之后变成小数的问题,小数在这个情境下,可以看做小数也为数组长度
            if(e.second>length)
            {
                return e.first;
            }
        }
        return 0;
    }
};

        以上便是本期的所有内容。

        本期内容到此结束^_^ 

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

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

相关文章

ctfshow VIP题目限免 版本控制泄露源码2

根据题目提示是版本控制泄露源码 版本控制&#xff08;Version Control&#xff09;是一种在软件开发和其他领域中广泛使用的技术&#xff0c;用于管理文件或项目的变更历史。 主流的版本控制工具&#xff1a; ‌Git‌&#xff1a;目前最流行的分布式版本控制系统。‌SVN‌&am…

蓝牙跳频扩频技术的作用:提升抗干扰能力与通信可靠性的核心机制

在无线通信技术领域&#xff0c;蓝牙&#xff08;Bluetooth&#xff09;以其短距离、低功耗和高兼容性成为连接电子设备的首选方案。其核心技术之一 ——跳频扩频&#xff08;Frequency Hopping Spread Spectrum, FHSS&#xff09;&#xff0c;是蓝牙在2.4 GHz ISM频段复杂电磁…

推荐系统(二十二):基于MaskNet和WideDeep的商品推荐CTR模型实现

在上一篇文章《推荐系统&#xff08;二十一&#xff09;&#xff1a;基于MaskNet的商品推荐CTR模型实现》中&#xff0c;笔者基于 MaskNet 构建了一个简单的模型。笔者所经历的工业级实践证明&#xff0c;将 MaskNet 和 Wide&Deep 结合应用&#xff0c;可以取得不错的效果&…

Ubuntu挂载HDD迁移存储PostgreSQL数据

关联博客&#xff1a;windows通用网线连接ubuntu实现ssh登录、桌面控制、文件共享 背景&#xff1a; 在个人ubuntu机器上安装了pgsql&#xff0c;新建了一张表插入了2000w数据用于模拟大批量数据分页查询用&#xff0c;但是发现查询也不慢&#xff08;在公司测试环境查询1700…

Flink CDC Pipeline mysql to doris

版本兼容 flink 与 flink-cdc版本兼容 flink 与doris版本兼容 运行同步程序 最终在 flink-1.20.1 与 flink-cdc-3.1.1 跑通测试 配置yaml文件 [rootchb1 flink-cdc-3.1.1]# cat mysql2doris.yaml ##################################################################…

Git 教程:从 0 到 1 全面指南 教程【全文三万字保姆级详细讲解】

目录 什么是 Git &#xff1f; Git 与 SVN 区别 Git 安装配置 Linux 平台上安装 Centos/RedHat 源码安装 Windows 平台上安装 使用 winget 工具 Mac 平台上安装 Git 配置 用户信息 文本编辑器 差异分析工具 查看配置信息 生成 SSH 密钥&#xff08;可选&#xf…

【 <二> 丹方改良:Spring 时代的 JavaWeb】之 Spring Boot 的未来:从微服务到云原生的演进

<前文回顾> 点击此处查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId12907601&sharereferPC&sharesourceFoyoDesigner&sharefromfrom_link <今日更新> 一、引子&…

beego文件上传

1file.go 2html代码 3路由设置 beego.Router("/file/Upload", &controllers.FileUploadController{}, "post:Upload") 注意 1&#xff0c;得新建个upload文件夹 2&#xff0c;路由设置严格区分大小写。 biiego文件下载上传代码 github 觉得不错Star下

2025-04-05 吴恩达机器学习5——逻辑回归(2):过拟合与正则化

文章目录 1 过拟合1.1 过拟合问题1.2 解决过拟合 2 正则化2.1 正则化代价函数2.2 线性回归的正则化2.3 逻辑回归的正则化 1 过拟合 1.1 过拟合问题 欠拟合&#xff08;Underfitting&#xff09; 模型过于简单&#xff0c;无法捕捉数据中的模式&#xff0c;导致训练误差和测试误…

基于Python的图书借阅推荐系统设计与实现

【Python】基于Python的图书借阅推荐系统设计与实现 &#xff08;完整系统源码开发笔记详细部署教程&#xff09;✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 本项目基于Python语言和Django框架开发&#xff0c;旨在为用户提供一个高可靠、高便捷的图…

Lua:第1-4部分 语言基础

1 Lua语言入门 1.1 程序段 我们将 Lua 语言执行的每一段代码&#xff08;例如&#xff0c;一个文件或交互模式下的一行&#xff09;称为一个程序段 &#xff08; Chunk &#xff09; &#xff0c;即一组命令或表达式组成的序列 。 1.2 一些词法规范 Lua 语言中的标识符&#…

2024版idea使用Lombok时报找不到符号

今天在springboot项目中使用Lombok的Builder注解&#xff0c;启动时居然报了找不到符号的错&#xff0c;如下图 于是开始了漫长的寻找之路&#xff0c;首先去settings->Plugins中看自己的Lombok插件是否启动&#xff0c;发现确实是如此&#xff0c;然后看网上的教程去加上这…

python中的sort使用

目录 sort()使用 排序处理 升序由小到大排序&#xff1a; sort与sorted 总结 降序由大到小排序&#xff1a; key 参数详解 按字符串长度升序排序 按字符串第二个字符排序 sort()使用 list.sort(keyNone, reverseFalse) 功能&#xff1a;对列表原地排序&#xff08;直接…

构建macOS命令速查手册:基于Flask的轻量级Web应用实践

构建macOS命令速查手册&#xff1a;基于Flask的轻量级Web应用实践 一、项目概述 本文介绍一个基于Flask框架开发的macOS命令速查Web应用。该应用通过结构化的命令数据存储和响应式前端设计&#xff0c;为用户提供便捷的命令查询体验&#xff0c;具备以下特点&#xff1a; 六…

APP的兼容性测试+bug定位方法

兼容性问题定位 一、为什么会有兼容性问题&#xff1f;二、APP兼容性测试场景三、常见的一些兼容性bug0. 引言1. 常见兼容性bug&#xff08;1&#xff09;界面性问题&#xff08;2&#xff09;内存不足&#xff08;3&#xff09;网络问题&#xff08;4&#xff09;权限问题 通过…

开源 PDF.js 文件编辑操作

一、PDF.js PDF.js 是 Mozilla 基金会推出的一个使用 HTML5 构建的 PDF 阅读器&#xff0c;它完全使用 JavaScript 编写。作为 Firefox 浏览器的默认 PDF 查看器&#xff0c;PDF.js 具有强大的兼容性和稳定性。它不仅支持 PDF 文件的查看和渲染&#xff0c;还提供了丰富的交互…

操作系统、虚拟化技术与云原生及云原生AI简述

目录 操作系统基础 操作系统定义 操作系统的组成 操作系统的分类 Linux操作系统特性 虚拟化技术 概述 CPU虚拟化 内存虚拟化 I/O虚拟化 虚拟化技术 虚拟化平台管理工具 容器 容器与云原生&#xff1a;详细介绍 容器的特点 什么是云原生&#xff1f; 云原生的特点 容器与云原生的…

深入理解 C++ 三大特性之一 继承

欢迎来到干货小仓库!!! 今日的Commit 是明日的 Releasse&#xff0c;用持续交付的心态活成终身迭代的版本。 1.继承的定义 1.1定义格式 1.2继承关系和访问限定符 1.3继承基类成员访问方式的变化 类成员/继承方式public继承protected继承private继承基类的public成员派生类的…

类 和 对象 的介绍

对象的本质是一种新的数据类型。类是一个模型&#xff0c;对象是类的一个具体化实例。为类创建实例也就是创建对象。 一、类&#xff08;class&#xff09; 类决定一个对象将是什么样的&#xff08;有什么属性、功能&#xff09;。类和变量一样&#xff0c;有名字。 1.创建类 …

LeetCode详解之如何一步步优化到最佳解法:20. 有效的括号

LeetCode详解系列的总目录&#xff08;持续更新中&#xff09;&#xff1a; LeetCode详解之如何一步步优化到最佳解法&#xff1a;前100题目录&#xff08;更新中...&#xff09;-CSDN博客 LeetCode详解系列的上一题链接&#xff1a; LeetCode详解之如何一步步优化到最佳解法…