剑指offer经典题目整理(七)

一、经典dp——最大子数组之和

1.链接

53. 最大子数组和 - 力扣(LeetCode)

2.描述

给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

3.思路

这是经典的动归问题,一般解决动归问题分四步:

1.描述状态:f(i) : 以第i个为子数组结尾的最大子数组之和

2.状态方程:f(i) = max(f(i-1) + arr[ i ],arr[ i ])

解析:我们假设第i个结尾的最大子数组之和为f(i),而我们若想知道下一个f(i+1),我们需要判断,arr[ i ] 在加上以前一个为底的最优解,也就是加上后较大还是不加较大,通过这个方式走dp就可以得到每一个为子数组底时的最优解,再其中选出一个最大的就是本题答案

3.初始状态:f(0)= arr[ 0 ]

4.dp容器:一维数组

关于本题的优化:本题中,我们实际并不需要记录每一步的最优解,只需要找到其中最大的,所以实际不需要容器去记录,只需要有一个整形去记录下最优解即可

4.参考代码

class Solution {
public:
    int maxSubArray(vector<int>& nums) 
    {
        int* dp = new int[nums.size()];
        dp[0] = nums[0];
        int ret = nums[0];
        for(int i = 1;i<nums.size();i++)
        {
            dp[i] = max(nums[i]+dp[i-1],nums[i]);
            if(ret < dp[i])
            {
                ret = dp[i];
            }
        }
        return ret;
    }
};

优化后:

class Solution {
public:
    int maxSubArray(vector<int>& nums) 
    {
        int dp = nums[0];
        int ret = nums[0];
        for(int i = 1;i<nums.size();i++)
        {
            dp = max(nums[i]+dp,nums[i]);
            if(ret < dp)
            {
                ret = dp;
            }
        }
        return ret;
    }
};

二、字符串回文

1.链接

回文数索引_牛客题霸_牛客网 (nowcoder.com)

2.描述

3.思路

关于字符串回文的题目,我们要想到头尾指针的思路,回文字符串的特点就是头指针和尾指针往中间一起走,都相同,这题说一定有一个解满足条件,说明我们只需要头尾指针去扫描,当遇到不同时,删除任意一个后再判断是否回文,若不是则说明另一个下标就是要删除的

4.参考代码

#include <iostream>
using namespace std;


bool is_pal(const string& str)//判断字符串回文
{
    int begin = 0;
    int end = str.size()-1;
    while(begin < end)
    {
        if(str[begin++] != str[end--])
        {
            return false;
        }
    }
    return true;;
}


int main() 
{
    int n;
    cin >> n;
    string str;
    while(n--)
    {
        cin >> str;
        if(is_pal(str))//若已经是回文,则不需要判断
        {
            cout << -1 << endl;
        }
        int begin = 0;
        int end = str.size()-1;
        while(begin < end)
        {
            if(str[begin] != str[end])
            {
                str.erase(begin,1);
                if(is_pal(str))
                {
                    cout << begin << endl;
                }
                else 
                {
                    cout << end << endl;
                }
                break;
            }
            begin++;
            end--;
        }
    }
    return 0;
}

三、把数组排列成最小数

1.链接

把数组排成最小的数_牛客题霸_牛客网 (nowcoder.com)

2.描述

输入一个非负整数数组numbers,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。

例如输入数组[3,32,321],则打印出这三个数字能排成的最小数字为321323。

1.输出结果可能非常大,所以你需要返回一个字符串而不是整数
2.拼接起来的数字可能会有前导 0,最后结果不需要去掉前导 0

3.思路

这里利用sort函数去实现排序,这道题其实是贪心算法,也就是局部最优解的方式,每个相邻的两个数拼接起来都是当前最小的顺序,则可以保证整个序列拼接起来就是最小的,我们可以写一个回调函数去交给sort去排

4.参考代码

#include <string>
class Solution 
{
public:

    static bool cmp(int x,int y)
    {
        string xs = to_string(x);
        string ys = to_string(y);
        string A = xs;
        A+=ys;
        string B =ys;
        B+=xs;
        return A<B;
    }

    string PrintMinNumber(vector<int>& numbers) 
    {
        if(numbers.empty())
        {
            return "";
        }
        sort(numbers.begin(),numbers.end(),cmp);
        string ret;
        for(int i =0;i<numbers.size();i++)
        {
            ret += to_string(numbers[i]);
        }
        return ret;
    }
};

四、单链表找公共节点

1.链接

两个链表的第一个公共结点_牛客题霸_牛客网 (nowcoder.com)

2.描述

输入两个无环的单向链表,找出它们的第一个公共结点,如果没有公共节点则返回空。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)

3.思路

快慢指针,先统计两个链表的长度,然后让长链表先走他们的差距步长,然后再一起走,判断相等

4.参考代码

class Solution 
{
public:
	int List_len(ListNode* pHead)
	{
		int count = 0;
		ListNode* cur = pHead;
		while(cur)
		{
			count++;
			cur = cur->next;
		}
		return count;
	}
    ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) 
	{
		int len1 = List_len(pHead1);
		int len2 = List_len(pHead2);
		int gap;
		ListNode* fast;
		ListNode* slow;
		if(len1 >= len2)
		{
			gap = len1 - len2;
			fast = pHead1;
			slow = pHead2;
		}
		else
		{			
			gap = len2 -len1;
			fast = pHead2;
			slow = pHead1;
		}
		while(gap--)//先让长的先走gap步
		{
			fast = fast->next;
		}
		while(fast && slow)//没有交点,通过这里退出
		{
			if(fast == slow)//找到交点,通过这里退出
			{
				break;
			}
			fast = fast->next;
			slow = slow->next;
		}
		//此时若是有交点,则通过break退出,fast和slow同时指向公共节点
		//若是没有交点,fast和slow也指向空,直接返回也可以
		return fast;
    }
};

五、二叉树判断深度

1.链接

二叉树的深度_牛客题霸_牛客网 (nowcoder.com)

2.描述

给一颗二叉树,要求返回二叉树的高度

3.思路

(1)递归思想

递归的往下遍历,分别得到左右子树的高度,然后比较返回大的那个,也可以是回溯算法的思想去解决

(2)层序遍历的思想

二叉树的层序遍历是利用队列的特性,将队首的节点出队列时,将其左右子树的节点放到队尾排队,从第一层开始,每次可以通过队列内的size大小得到每一层有多少个节点,因此可以分层次的将每一层的数据打印出来,因此也能够用这个办法去统计有多少层

4.参考代码

(1)递归思想

class Solution 
{
public:
    int TreeDepth(TreeNode* pRoot) 
	{
		if(pRoot == nullptr)
		{
			return 0;
		}
		int Left = TreeDepth(pRoot->left) + 1;
		int Right = TreeDepth(pRoot->right) + 1;
		return Left > Right ? Left : Right;
    }
};

(2)层序遍历的思想

class Solution 
{
public:
    int TreeDepth(TreeNode* pRoot) 
	{
		if(pRoot == nullptr)//为空则返回0
		{
			return 0;
		}
		int len = 0;//用来统计高度/层数
		queue<TreeNode*> q;
		q.push(pRoot);
		while(!q.empty())
		{
			int size = q.size();//记录每一层的大小,每次出完一层会更新size值
			for(int i = 0;i<size;i++)//将每一层的数据都遍历pop,并且把下一层的数据放到队列中
			{
				TreeNode* tmp = q.front();
				q.pop();
				if(tmp->left != nullptr)
				{
					q.push(tmp->left);
				}
				if(tmp->right != nullptr)
				{
					q.push(tmp->right);
				}
			}
			len++;//每出完一层就统计一层
		}
		return len;
    }
};

总结

这次的总结里,有几题特别经典的题目,例如动归,找节点等等

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深入BEV感知中的魔鬼细节:综述、评估和秘诀

深入BEV感知中的魔鬼细节&#xff1a;综述、评估和秘诀 论文链接&#xff1a;https://arxiv.org/pdf/2209.05324.pdf 学习感知任务的鸟瞰图&#xff08;BEV&#xff09;中的强大表示法是一种趋势&#xff0c;并引起了工业界和学术界的广泛关注。大多数自动驾驶常规方法是在前…

力扣---子集---回溯(子集型回溯)---递归

递归法思路&#xff1a; 首先考虑为什么能用递归&#xff08;因为存在大问题和小问题之间的关系&#xff0c;大问题&#xff1a;从第 i 个数字到最后一个数字之间找子集&#xff0c;小问题&#xff1a;从第 i1 个数字到最后一个数字之间找子集&#xff09;。其次&#xff0c;用…

力扣hot100题解(python版81-90题)

81、爬楼梯 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 示例 1&#xff1a; 输入&#xff1a;n 2 输出&#xff1a;2 解释&#xff1a;有两种方法可以爬到楼顶。 1. 1 阶 1 阶 2. 2 阶示…

如何正确看待竞争对手

很多人一天到晚的抱怨说实体经济不行啦&#xff0c;互联网经济也不行啦&#xff0c;我跟你说&#xff0c;抱怨没有用&#xff0c;你抱怨&#xff0c;这个时代是这样&#xff0c;不抱怨它也是这样&#xff0c;你抱怨&#xff0c;它也在&#xff0c;你不抱怨它还在。不是实体经济…

基于springboot+vue的毕业论文管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

基于SpringBoot的网上订餐系统

技术&#xff1a;springbootvuemysql 一、系统背景 随着我国经济的飞速发展&#xff0c;人们的生活速度明显加快&#xff0c;在餐厅吃饭排队的情况到处可见&#xff0c;近年来由于新兴IT行业的空前发展&#xff0c;它与传统餐饮行业也进行了新旧的结合&#xff0c;很多餐饮商户…

ensp不同vlan间的互相通信

关于不同vlan之间的通信&#xff0c;本章做了最简洁的案例&#xff0c;表示说明 1. 网段设置 1.1 划分四个不同 的 vlan vlan网段vlan10192.168.10.254 /24vlan20192.168.20.254 /24vlan30192.168.30.254 /24vlan40192.168.40.254 /24 1.2 SW1的配置 #进入视图 sys #更改交…

微调alpaca-lora遇到的一些问题

1、环境简介 环境&#xff1a; 系统&#xff1a;Ubuntu torch&#xff1a;2.2.1 python&#xff1a;3.10 gpu&#xff1a;V100 16g peft&#xff1a;0.9.0 使用PEFT中的lora方式微调llama-2-7b-hf&#xff0c;项目地址&#xff1a;alpaca-lora 2、混合精度训练Tensor相互计算会…

第十九章 TypeScript 装饰器Decorator

Decorator 装饰器是一项实验性特性&#xff0c;在未来的版本中可能会发生改变 它们不仅增加了代码的可读性&#xff0c;清晰地表达了意图&#xff0c;而且提供一种方便的手段&#xff0c;增加或修改类的功能 若要启用实验性的装饰器特性&#xff0c;你必须在命令行或tsconfig…

Springboot+vue的高校教师科研管理系统+数据库+报告+免费远程调试

项目介绍: Javaee项目&#xff0c;springboot vue前后端分离项目 本文设计了一个基于Springbootvue的前后端分离的高校教师科研管理系统&#xff0c;采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xf…

THM学习笔记—Bounty Hacker

nmap扫描&#xff0c;扫了一大堆但只有三个端口是开放的 试试ftp是否可以匿名登录 可以匿名登录&#xff0c;把里面的文件下载下来 查看里面的内容&#xff0c;猜lin为用户名&#xff0c;locks.txt为密码列表&#xff0c;使用hydra进行ssh登录。 找到密码了&#xff0c;进行ssh…

【Mybatis整合mysql之Json类型属性适配手把手】

【Mybatis整合mysql之Json类型属性适配&&手把手】 场景 JSON 数据类型是 MySQL 5.7.8 开始支持的。在此之前&#xff0c;只能通过字符类型&#xff08;CHAR&#xff0c;VARCHAR 、TEXT或LONGTEXT &#xff09;来保存 JSON 文档。在开发中发现&#xff0c;Mybatis查询…

AWS监控,AWS 性能监控工具

监控云部署的性能是 IT 环境正常运行的内在条件。AWS 云是一个架构良好的框架&#xff0c;管理员可以使用专用的AWS 性能监控工具增强服务的功能。执行AWS监视是为了跟踪在AWS环境中积极运行的应用程序工作负载和资源。AWS监视器跟踪各种AWS云指标&#xff0c;以帮助提高在其上…

电子证书查询系统如何制作证书?

1、制作空白证书&#xff1a;网上找一张证书背景图&#xff0c;用PPT工具或photoshop等图片处理工具&#xff0c;将证书上固定的文字打上&#xff0c;有公章的话贴上电子公章&#xff0c;不固定的内容留空白。 2、制作电子证书&#xff1a;上传前一步制作好的空白证书&#xf…

LeetCode刷题记录:(13)N皇后(难题不难)

leetcode传送通道 传说中的N皇后&#xff0c;不难&#xff0c;进来了就看完吧 注释序号代表鄙人写代码的顺序和思考逻辑&#xff0c;供参考 class Solution {// 1.定义结果数组List<List<String>> result new ArrayList<>();public List<List<String&…

moviepy简介及使用教程

moviepy简介及基本概念 MoviePy 是一个用于视频编辑的 Python 库&#xff0c;使用户能够处理、编辑和操作视频文件。这个库允许你剪辑视频、添加文本、合并视频剪辑&#xff0c;以及应用各种效果和转换。它建立在 NumPy、imageio 和 Decorator 等库的基础上&#xff0c;使得在…

部署mysql,前端,后端

部署mysql docker pull mysql 从镜像源中拉取镜像。 创建mysql容器 docker run -d \--name mysql_container \-p 3306:3306 \-e TZAsia/Shanghai \-e MYSQL_ROOT_PASSWORD123 \--restartalways \-v /opt/mysql:/var/lib/mysql \mysql -d后台运行&#xff0c;--name指定容器…

点餐小程序开发:如何通过抽奖与消费者互动

随着科技的发展&#xff0c;越来越多的商家开始使用点餐小程序来提升自己的服务质量和效率。然而&#xff0c;仅仅提供点餐服务并不能满足消费者的需求&#xff0c;他们还需要一种方式来增加与商家的互动&#xff0c;提高消费体验。抽奖活动就是一种非常有效的互动方式&#xf…

C++ stack和queue

什么是stack stack就是平常所说的栈&#xff0c;栈只能进行在固定的一端插入数据和删除数据的操作&#xff0c;也就是先进后出&#xff0c;后进先出 什么是queue queue是平常所说的队列&#xff0c;队列就像平常排队吃饭一样&#xff0c;先到的就有饭吃&#xff0c;只能从一端…

C语言每日一题07

一、题目 二、解析 逻辑与 &&、逻辑或 || 均有“短路”特性: 逻辑与&&“短路”&#xff1a;当逻辑与&&的左操作数为逻辑 “假“ 时&#xff0c;就足以判断该逻辑运算的结果为假了&#xff0c;故右操作数就不再被执行。 逻辑或||“短路”&#xff1a…