【C++ 算法进阶】算法提升二十三

目录

  • 左右数组相减绝对值最大值 (题意代换)
    • 题目
    • 题目分析
  • 可整合数组 (题意代换)
    • 题目
    • 题目分析
    • 代码
  • 水王问题
    • 题目
    • 题目分析
    • 代码
    • 水王问题变形
    • 思路讲解
  • 合并石头的最低成本 (动态规划)
    • 题目
    • 题目分析
    • 代码

左右数组相减绝对值最大值 (题意代换)

题目

现在给定你一个数组 数组中可能有正数 负数或零且数组长度大于2

现在让你将这个数组分为左右两个数组 请问这两个数组中的最大值相减的绝对值最大是多少

题目分析

这个题目我们可以直接暴力计算左右数组的最大值

也可以设置一个辅助数组 将左右数组的最大值填写到辅助数组中

不过最简单的方式是 我们可以从数组中寻找一个最大值 之后让这个最大值减去 左右两个边角中较小的那个值即可

原理如下

  1. 假设max在左数组中 那么就要求右数组中的最大值尽可能的小 那么右数组中就应该只有最边角一个数
  2. max在右数组中同理

因为本题解法代码很简单 所以说这里就不提供了

可整合数组 (题意代换)

题目

我们给定一个概念

一个数组 假设排序后是依次递增1的 我们就可以将这个数组称之为可整合数组

现在给定你一个数组 要求你给出这个数组中最大可整合子数组的长度

题目分析

我们这个时候要将可整合这个数组的概念转化为一个或者几个更加理解 code更容易写出来的条件

我们可以转化为如下的条件

  1. 数组中无重复值
  2. 数组中的最大值减去最小值等于数组的个数加一

代码

int process(vector<int>& nums) {
	if (nums.size() == 0) {
		return 0;
	}

	unordered_set<int> unset;
	int ans = 1;
	for (int i = 0; i < nums.size(); i++)
	{
		unset.clear();
		int lnmax = nums[i];
		int lnmin = nums[i];
		for (int j = i; j < nums.size(); j++) {
			if (unset.count(nums[j] == 1))
			{
				break;
			}
			else
			{
				unset.insert(nums[j]);
			}

			lnmax = max(lnmax, nums[j]);
			lnmin = min(lnmin, nums[j]);
			if (lnmax - lnmin == j - i) {
				ans = max(ans, j - i + 1);
			}
		}
	}

	return ans;
}

水王问题

题目

超级水王问题:给你一个数组,出现次数大于数组长度的一半的元素称之为水王数,怎么能快速找到水王数?

内存限制:时间复杂度O(n),额外空间复杂度O(1)——也就是遍历数组的次数为有限次,申请的变量数为有限个

题目分析

我们注意到水王的一个明显特征 如果这个数是水王 哪怕其他所有数一对一和水王数同归于尽 那么最终剩下的也肯定是水王数

反之 如果这个数不是水王数 则说明这个数组中不存在水王

我们就可以使用这个特征来进行代码编写

代码

int process(vector<int> nums) {
	if (nums.size() == 0)
	{
		return -1;
	}

	int cand = 0;
	int hp = 0;
	for (auto x : nums) {
		if (hp == 0) {
			cand = x;
			hp = 1;
		}
		else
		{
			if (cand == x) {
				hp++;
			}
			else
			{
				hp--;
			}
		}
	}

	if (hp == 0) {
		return -1;
	}

	hp = 0;
	for (auto x : nums) {
		if (x == cand) {
			hp++;
		}
	}

	if (hp > nums.size() / 2) {
		return cand;
	}

	return -1;
}

水王问题变形

假设现在水王数定义为大于 7/N 我们应该如何做呢?

思路讲解

假设水王数大于 N/7 那么就表示数组中 最多有六个水王数

我们可以设置一张哈希表 每当哈希表不为空或者候选数目存在哈希表中的时候 我们可以将此数添加到哈希表中或者让此数的血量加一

如果候选表慢了 我们就可以直接让map中所有的候选血量减一 如果血量减为0 则删除该数

最后按照水王问题进行验证即可

合并石头的最低成本 (动态规划)

题目

本题为LC原题 题目如下

在这里插入图片描述

题目分析

本题是一个动态规划问题

我们首先要想出一个尝试函数

想出的尝试函数为

 process(vector<int>& stones, int k, int L, int R, int p) 

其中各个参数的含义为 k表示要连续石头个数 L和R表示尝试的范围 p表示需要分割成几块

我们最终调用的函数为

process(stones, k, 0, n - 1, 1)

从0~n-1上分割成一块

代码

const int N = 31;
int presum[N];
int dp[N][N][N]; // dp[L][R][p] 表示区间 [L, R] 合并成 p 堆的最小成本

class Solution {
public:
    int process(vector<int>& stones, int k, int L, int R, int p) {
        // 如果已经计算过该子问题,直接返回结果
        if (dp[L][R][p] != -1) {
            return dp[L][R][p];
        }

        if ((R - L + 1 - p) % (k - 1) != 0) {
            return dp[L][R][p] = -1; // 无法合并
        }
        if (L == R) {
            return dp[L][R][p] = (p == 1 ? 0 : -1); // 单点只能合并成1堆
        }

        if (p == 1) {
            int next = process(stones, k, L, R, k);
            if (next == -1) {
                return dp[L][R][p] = -1;
            } else {
                return dp[L][R][p] = next + presum[R + 1] - presum[L];
            }
        } else {
            int ans = INT_MAX;
            for (int mid = L; mid < R; mid += k - 1) {
                int next1 = process(stones, k, L, mid, 1);
                int next2 = process(stones, k, mid + 1, R, p - 1);
                if (next1 != -1 && next2 != -1) {
                    ans = min(ans, next1 + next2);
                }
            }
            return dp[L][R][p] = (ans == INT_MAX ? -1 : ans); // 记录结果
        }
    }

    int mergeStones(vector<int>& stones, int k) {
        int n = stones.size();
        if ((n - 1) % (k - 1) != 0) {
            return -1; // 无法合并为一堆
        }

        presum[0] = 0; // 初始化前缀和
        for (int i = 0; i < n; i++) {
            presum[i + 1] = presum[i] + stones[i];
        }

        // 初始化 dp 数组
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                for (int p = 0; p < N; p++) {
                    dp[i][j][p] = -1; // -1 表示未计算
                }
            }
        }

        return process(stones, k, 0, n - 1, 1);
    }
};

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

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

相关文章

solr 远程命令执行 (CVE-2019-17558)

漏洞描述 Apache Velocity是一个基于Java的模板引擎&#xff0c;它提供了一个模板语言去引用由Java代码定义的对象。Velocity是Apache基金会旗下的一个开源软件项目&#xff0c;旨在确保Web应用程序在表示层和业务逻辑层之间的隔离&#xff08;即MVC设计模式&#xff09;。 Apa…

idea怎么打开两个窗口,运行两个项目

今天在开发项目的时候&#xff0c;前端希望运行一下以前的项目&#xff0c;于是就需要开两个 idea 窗口&#xff0c;运行两个项目 这里记录一下如何设置&#xff1a;首先依次点击&#xff1a; File -> Settings -> Appearance & Behavior ->System Settings 看到如…

PPT分享 | IBM集团业务流程架构顶层规划-订单到交付-销售到回款方案

PPT下载链接见文末~ IBM业务流程规划方法是一套结构化、体系化的流程设计理论&#xff0c;其企业流程框架&#xff08;EPF&#xff09;是一种用于企业业务流程架构设计梳理的方法论。 一、IBM业务流程规划方法的核心 IBM的BPM&#xff08;业务流程管理&#xff09;流程管理体…

MySQL闪回恢复:轻松应对数据误删,数据安全有保障

在数据库管理中&#xff0c;数据误删是一个常见且棘手的问题。传统的数据恢复方法可能涉及复杂的操作&#xff0c;如全量备份和增量备份的恢复。MySQL的闪回恢复功能提供了一种更为简便、高效的数据恢复手段。本文将详细介绍MySQL闪回恢复的原理、配置和使用方法&#xff0c;帮…

加菲工具 - 好用免费的在线工具集合

加菲工具 https://orcc.online AI 工具 加菲工具 集合了目前主流的&#xff0c;免费可用的ai工具 文档处理 加菲工具 pdf转word、office与pdf互转等等工具都有链接 图片图标 加菲工具 统计了好用免费的在线工具 编码解码 加菲工具 base64编码解码、url编码解码、md5计算…

uniapp跨域问题解决方案

uniapp跨域问题解决方案 引言 在使用 uni-app 本地开发 H5> 平台时&#xff0c;需要使用浏览器进行调试&#xff0c;而浏览器会有跨域的问题。比如直接通过本地IP地址去访问开发中的页面&#xff0c;同时这个页面会调一些现有的接口时&#xff0c;就面临着跨域的问题。 解决…

ensp静态路由实验

一、实验目的 1、熟练掌握交换机的基本配置命令 2、熟练掌握静态路由的使用方法 3. 熟练掌握交换机端口模式 二、实验内容 需求&#xff1a; 根据要求利用现有实验设备组建小型局域网 实验设备&#xff1a; 交换机S37002台&#xff1b;PC机2台&#xff1b;路由器2台。 …

I2C学习

详情学习 12. I2C通讯 — [野火]Linux基础与应用开发实战指南——基于LubanCat-RK系列板卡 文档 (embedfire.com) I2C总线协议详解&#xff08;特点、通信过程、典型I2C时序&#xff09;-CSDN博客 彻底搞懂I2C总线&#xff08;一&#xff09;什么是I2C&#xff1f;什么是总线…

Neural Magic 发布 LLM Compressor:提升大模型推理效率的新工具

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

AIGC实战——生成式人工智能总结与展望

AIGC实战——生成式人工智能总结与展望 0. 前言1. 生成式人工智能发展历程1.1 VAE 和 GAN 时代1.2 Transformer 时代1.3 大模型时代 2. 生成式 AI 的当前进展2.1 大语言模型2.2 文本生成代码模型2.3 文本生成图像模型2.4 其他应用 3. 生成式人工智能发展展望3.1 生成式 AI 在工…

Matlab 深度学习工具箱 案例学习与测试————求二阶微分方程

clc clear% 定义输入变量 x linspace(0,2,10000);% 定义网络的层参数 inputSize 1; layers [featureInputLayer(inputSize,Normalization"none")fullyConnectedLayer(10)sigmoidLayerfullyConnectedLayer(1)sigmoidLayer]; % 创建网络 net dlnetwork(layers);% 训…

Vue 2.6 中使用 Composition Api 笔记

文章目录 我的开发环境Vue2.6 Composition Api 风格总结获取当前组件的上下文获取路由依赖注入&#xff08;我的有问题&#xff09;通过 Vue 上下文获取 其他方法总结路由守卫参考 我的开发环境 我相关依赖的版本是 "vue": "2.6.10", 想要使用 Composi…

✨系统设计时应时刻考虑设计模式基础原则

目录 &#x1f4ab;单一职责原则 (Single Responsibility Principle, SRP)&#x1f4ab;开放-封闭原则 (Open-Closed Principle, OCP)&#x1f4ab;依赖倒转原则 (Dependency Inversion Principle, DIP)&#x1f4ab;里氏代换原则 (Liskov Substitution Principle, LSP)&#x…

GoF设计模式——结构型设计模式分析与应用

文章目录 UML图的结构主要表现为&#xff1a;继承&#xff08;抽象&#xff09;、关联 、组合或聚合 的三种关系。1. 继承&#xff08;抽象&#xff0c;泛化关系&#xff09;2. 关联3. 组合/聚合各种可能的配合&#xff1a;1. 关联后抽象2. 关联的集合3. 组合接口4. 递归聚合接…

日常开发记录-正确的prop传参,reduce搭配promise的使用

日常开发记录-正确的prop传参&#xff0c;reduce搭配promise的使用 1.正确的prop传参2.reduce搭配promise的使用 1.正确的prop传参 一般会的父组件传参子组件 //父组件 <A :demodata.sync"testData" :listData.sync"testData2"></A> data ()…

Windows系统电脑安装TightVNC服务端结合内网穿透实现异地远程桌面

文章目录 前言1. 安装TightVNC服务端2. 局域网VNC远程测试3. Win安装Cpolar工具4. 配置VNC远程地址5. VNC远程桌面连接6. 固定VNC远程地址7. 固定VNC地址测试 前言 在追求高效、便捷的数字化办公与生活的今天&#xff0c;远程桌面服务成为了连接不同地点、不同设备之间的重要桥…

IDEA2019搭建Springboot项目基于java1.8 解决Spring Initializr无法创建jdk1.8项目 注释乱码

后端界面搭建 将 https://start.spring.io/ 替换https://start.aliyun.com/ 报错 打开设置 修改如下在这里插入代码片 按此方法无果 翻阅治疗后得知 IDEA2019无法按照网上教程修改此问题因此更新最新idea2024或利用插件Alibaba Clouod Toolkit 换用IDEA2024创建项目 下一步…

Paper -- 洪水深度估计 -- 利用图像处理和深度神经网络绘制街道照片中的洪水深度图

基本信息 论文题目&#xff1a;Flood depth mapping in street photos with image processing and deep neural networks 中文题目: 利用图像处理和深度神经网络绘制街道照片中的洪水深度图 作者及单位&#xff1a; Bahareh Alizadeh Kharazi&#xff0c;美国得克萨斯州立大…

准备阶段 AssetChecker性能分析工具的使用

UPR资源检测工具AssetChecker的使用 AssetChecker主要功能 支持所有版本的Unity项目 不依赖UnityEditor,无需安装绿色运行 检测速度极快&#xff0c;可在UPR中查看结果和修改建议 支持命令模式&#xff0c;可以CI/CD工具集成&#xff0c;实现自动化检测 检测库持续更新 支持A…

【Python】分割秘籍!掌握split()方法,让你的字符串处理轻松无敌!

在Python开发中&#xff0c;字符串处理是最常见也是最基础的任务之一。而在众多字符串操作方法中&#xff0c;split()函数无疑是最为重要和常用的一个。无论你是Python新手&#xff0c;还是经验丰富的开发者&#xff0c;深入理解并熟练运用split()方法&#xff0c;都将大大提升…