【C#算法实现】可见的山峰对数量

文章目录

  • 前言
  • 一、题目要求
  • 二、算法设计及代码实现
    • 2.1 算法思想
    • 2.2 代码实现

前言

本文是【程序员代码面试指南(第二版)学习笔记】C#版算法实现系列之一,用C#实现了《程序员代码面试指南》(第二版)栈和队列中的可见的山峰对数量。文中的示意图也都来自此书。


一、题目要求

给出一个全为正整数的循环数组,每一个数字表示一个山峰的高度,找出一共有几对山峰可以相互看到。
相互看到的条件:如果两座山峰之间不管是顺序看也好逆序看也罢,只要有一个方向可以达到两座山峰之间的山的高度都小于两座山峰的要求,那么就说明相互可以看到。
示例
如图,最下方的5可以和左边的3相互看到,因为中间的2 < 3且2 < 5。最下面的5和最右边的5也是相互可见的,虽然顺时针方向有一个5不小于5,但是逆时针方向中间只有4和3,是满足要求的,所以互相可见。

二、算法设计及代码实现

2.1 算法思想

概述:首先要确定一点,假如A能看到B,那么其实计算过程中如果还计算B能看到A就重复了。而又因为低山峰找高山峰较为方便,这里确定为小找大。确定为小找大后,就可以定义一个单调递增的栈,保证栈内元素始终为栈顶到栈底依次增大。如果遇到相同大小的元素,那么只需要在该元素位置记录次数加一即可。首先将栈底放入最大值,随后遍历数组。遇到不符合单调性的元素入栈时,说明栈顶元素找到了前进方向的比自己高的山了,由于栈底肯定大于栈顶,也就说明栈顶两端都满足小找大的条件了,不可能找到更多对的山峰了,这时就可以出栈计算结果了。遍历结束一遍后,还会有剩余元素,这时依旧按照小找大规则进行出栈计算即可。

详细步骤
1、定义一个记录值和出现次数的结构体,这里选择用类是因为结构体是值类型,修改不如引用类型方便。
2、初始化一个栈和记录结果的变量。
3、找出最大值和最大值所在的序列作为遍历的起点。
4、循环遍历一遍数组,遍历每个元素都做以下操作:
1)栈空直接放入元素。
2)栈顶小于当前要放入的元素,那么就出栈,出栈累加结果,此时找到的山峰对数为2 * times + times * (times - 1) / 2。
3)如果相等,则直接累加出现次数。
4)符合单调性,则直接放入。
5、遍历结束后还有剩余元素,此时分为三个阶段:
1)如果剩余元素大于等于三个,逐个出栈,直到剩下2个为止。出栈时,累加结果公式为2 * times + times * (times - 1) / 2。
2)倒数第二个元素的出栈:记最后一个元素的重复次数为lt,那么累加结果公式为times * (lt > 1 ? 2 : 1) + times * (times - 1) / 2
3)最后一个元素的出栈公式为times * (times - 1) / 2。

2.2 代码实现

public class Record(int value, int times) {public int value = value;public int times = times;
}public static int GetVisibleNum(int[] arr) {int n = arr.Length;Stack<Record> stack = new();int ans = 0;// 找出最大值和位置int max = 0;int maxIndex = -1;for (int i = 0; i < n; i++) {if (arr[i] > max) {max = arr[i];maxIndex = i;}}// 从最大值的位置开始遍历for (int i = maxIndex; i < n + maxIndex; i++) {int index = i % n;int value = arr[index];// 如果栈为空, 直接入栈if (stack.Count == 0) {stack.Push(new Record(value, 1));continue;}// 栈顶元素小于当前元素, 则出栈while (stack.Peek().value < value) {Record record = stack.Pop();ans += record.times * 2 + record.times * (record.times - 1) / 2;}// 栈顶元素等于当前元素, 则更新栈顶元素的次数if (stack.Peek().value == value) {Record record = stack.Peek();record.times++;}// 栈顶元素大于当前元素, 则入栈else {stack.Push(new Record(value, 1));}}// 栈中剩余元素while (stack.Count > 2) {Record record = stack.Pop();ans += record.times * 2 + record.times * (record.times - 1) / 2;}if (stack.Count == 2) {Record record = stack.Pop();Record last = stack.Peek();ans += record.times * (last.times > 1 ? 2 : 1) + record.times * (record.times - 1) / 2;}if (stack.Count == 1) {Record record = stack.Pop();ans += record.times * (record.times - 1) / 2;}return ans;
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redisson

Redisson 1 什么是Redisson2.SpringBoot整合Redisson3.使用Redisson实现分布式锁3.1 Redisson是如何解决这两个问题的呢?3.2 Redisson是怎么保证自己加的锁, 自己释放锁? 1 什么是Redisson Redisson是一个基于Redis的java框架, 用于简化Redis的操作. 它提供了丰富的功能, 包…

Python 界面逻辑分离示例

使用PyQt5设计UI界面开发桌面应用程序的小伙伴&#xff0c;刚开始可能都会遇到这样让人不爽的事&#xff1a;用Qt Designer好不容易设计好的界面并写好逻辑代码&#xff0c;已经可以正常运行了&#xff0c;某天发现界面要做个小改动(这种事好象永远都避不了)&#xff0c;重新修…

MySQL8.0索引新特性

文章目录 1 支持降序索引2 隐藏索引 1 支持降序索引 举例&#xff1a;分别在MySQL 5.7版本和MySQL 8.0版本中创建数据表ts1&#xff0c;结果如下&#xff1a; CREATE TABLE ts1(a int,b int,index idx_a_b(a,b desc) );在MySQL 5.7版本中查看数据表ts1的结构&#xff0c;从结…

【SpringBoot】请求与响应参数 IoC与DI 总结

文章目录 ① —— 请求 ——一、简单参数 RequestParam1.1 参数与形参 命名相同1.2 参数与形参 命名不同 二、实体参数2.1 简单实体对象2.2 复杂实体对象 三、数组集合参数3.1 数组3.2 集合 RequestParam 四、日期参数 DateTimeFormat五、JSON参数 RequestBody六、路径参数 Pat…

下载chromedrive,使用自动化

1、先看一下自己浏览器的版本 2、访问 https://googlechromelabs.github.io/chrome-for-testing/

QT中dumpcpp以及dumpdoc使用

qt中调用COM的方式方法有四种&#xff0c;参考解释在 Qt 中使用 ActiveX 控件和 COM (runebook.dev) 介绍dumpcpp的使用方法Qt - dumpcpp 工具 (ActiveQt) (runebook.dev)&#xff1a; 在安装好了的qt电脑上&#xff0c;通过powershell窗口来实现&#xff0c;powershell比cmd要…

算法——贪心

「贪心的本质是选择每一阶段的局部最优&#xff0c;从而达到全局最优」 贪心无套路 1. 分发饼干 贪心策略&#xff1a; &#xff08;1&#xff09;局部最优就是大饼干喂给胃口大的&#xff0c;充分利用饼干尺寸喂饱一个&#xff0c;全局最优就是喂饱尽可能多的小孩 &#xff08…

广州大彩科技新品发布:大彩科技COF系列2.4寸串口屏发布!

一、产品介绍 此次发布的是S系列平台2.4寸COF超薄结构串口屏&#xff0c;分辨率为240*320&#xff0c;该平台采用了Cortex-M3内核的处理器&#xff0c;内置了2Mbyte PSRAM和64Mbit FLASH&#xff0c;是专为小尺寸串口屏设计的MCU&#xff0c;精简了外围电路。 该平台默认支持大…

element ui 中文离线文档(百度云盘下载)

一般内网开发上不了网&#xff0c;用离线版本比较方便&#xff0c;下载地址&#xff1a; https://download.csdn.net/download/li836779537/88355878?spm1001.2014.3001.5503 下载后里面有个 index.hrml 双击打开就可以用 效果如下&#xff1a;

2024.3.14jsp(2)

一、实验目的 掌握eclipse开发工具的使用&#xff1b;jsp标记、如指令标记&#xff0c;动作标记&#xff1b;变量和方法的声明&#xff1b;Java程序片&#xff1b; 实验&#xff1a;看电影 源代码watchMovie.jsp <% page language"java" contentType"text…

STM32/GD32——FreeRTOS任务管理与相关机制

芯片选型 Ciga Device — GD32F470系列 任务管理 任务处理API 操作 API 动态任务创建 xTaskCreate 任务删除 vTaskDelete 静态任务创建 vTaskCreateStatic 挂起任务 vTaskSuspend 恢复任务 vTaskResume 任务创建 BaseType_t xTaskCreate( TaskFunction_t pxTa…

【GPT-SOVITS-05】SOVITS 模块-残差量化解析

说明&#xff1a;该系列文章从本人知乎账号迁入&#xff0c;主要原因是知乎图片附件过于模糊。 知乎专栏地址&#xff1a; 语音生成专栏 系列文章地址&#xff1a; 【GPT-SOVITS-01】源码梳理 【GPT-SOVITS-02】GPT模块解析 【GPT-SOVITS-03】SOVITS 模块-生成模型解析 【G…

FPGA高端项目:FPGA基于GS2971+GS2972架构的SDI视频收发+HLS多路视频融合叠加,提供1套工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐本博已有的 SDI 编解码方案本方案的SDI接收发送本方案的SDI接收图像缩放应用本方案的SDI接收纯verilog图像缩放纯verilog多路视频拼接应用本方案的SDI接收HLS图像缩放HLS多路视频拼接应用本方案的SDI接收OSD多路视频融合叠加应用本方案的S…

基于Linux内核的socket编程(TCP)的C语言示例

原文地址&#xff1a;https://www.geeksforgeeks.org/socket-programming-cc/ 服务端&#xff1a; #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <unistd.h>#…

Annaconda环境下ChromeDriver配置及爬虫编写

Anaconda环境的chromedriver安装配置_anaconda 配置chromedriver-CSDN博客 Chromedriver驱动( 121.0.6167.85 ) - 知乎 下载好的驱动文件解压&#xff0c;将exe程序复制到Annaconda/Scripts目录以及Chrome/Application目录下 注意要提前pip install selenium包才能运行成功&a…

【linux深入剖析】操作系统与用户之间的接口:自定义简易shell制作全过程

&#x1f341;你好&#xff0c;我是 RO-BERRY &#x1f4d7; 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f384;感谢你的陪伴与支持 &#xff0c;故事既有了开头&#xff0c;就要画上一个完美的句号&#xff0c;让我们一起加油 目录 1.shell2.自定义shell的准…

理财第一课:炒股词典

文章目录 基础代码规则委比委差量比换手率市盈率市净率 散户亏钱的原因庄家分析炒股战法波浪理论其它 钱者&#xff0c;人生之大事&#xff0c;死生存亡之地&#xff0c;不可不察也。耕田之利&#xff0c;十倍&#xff1b;珠玉之赢&#xff0c;百倍&#xff1b;闹革命&#xff…

Spring6--基础概念

1. 概述 1.1. Spring是什么 Spring 是一套广泛应用于 Java 企业级应用开发领域的轻量级开源框架&#xff0c;由 Rod Johnson 创立&#xff0c;旨在显著降低 Java 企业应用的复杂性&#xff0c;缩短开发周期&#xff0c;并提升开发效率。Spring 不仅适用于服务器端开发&#x…

<Senior High School Math>: inequality question

( 1 ) . o m i t (1). omit (1).omit ( 2 ) . ( a 2 − b 2 ) ( x 2 a 2 − y 2 b 2 ) ( x 2 y 2 ) − ( a 2 y 2 b 2 b 2 x 2 a 2 ) ≤ x 2 y 2 − 2 x y ( x − y ) 2 (2). (a^2-b^2)(\frac{x^2}{a^2} - \frac{y^2}{b^2})(x^2y^2)-(\frac{a^2y^2}{b^2}\frac{b^2x^2}{a^…

Mysql 死锁案例4-delete 相邻记录导致死锁

死锁复现 CREATE TABLE t (id int(11) NOT NULL,c int(11) DEFAULT NULL,d int(11) DEFAULT NULL,PRIMARY KEY (id),KEY c (c) ) ENGINEInnoDB DEFAULT CHARSETutf8;/*Data for the table t */insert into t(id,c,d) values (0,0,0),(5,5,5),(10,10,10),(15,15,15) 事务1事…