【18】中级提升1

news2024/12/24 8:53:01

题目一 

策略:

每次将绳子右端点放在一个点上,看绳子往左可以覆盖多少个点。

如何知道左边覆盖几个点?

在绳子右端点cur左边有序区域找第一个大于等于arr[cur]-L的位置

滑动窗口

每次绳子左侧放在一个点上,然后有边界向右走,要求【绳子长度arr[R]-arr[L]+1】超过绳子长度L

每次R不能继续往右动,就移动左边界,然后再看有边界能否继续右动。。。周而复始【窗口边界都不回头的】 => O(N)

	// 长度为L的绳子最多覆盖几个点,请保证arr有序
	public static int maxPoint(int[] arr, int L) {
		int res = 1;
		for (int i = 0; i < arr.length; i++) {
			int nearest = nearestIndex(arr, i, arr[i] - L);
			res = Math.max(res, i - nearest + 1);
		}
		return res;
	}

	// 在arr[0..R]范围上,找满足>=value的最左位置
	public static int nearestIndex(int[] arr, int R, int value) {
		int L = 0;
		int index = R;
		while (L < R) {
			int mid = L + ((R - L) >> 1);
			if (arr[mid] >= value) {
				index = mid;
				R = mid - 1;
			} else {
				L = mid + 1;
			}
		}
		return index;
	}

	public static void main(String[] args) {
		int[] arr = { 0, 13, 24, 35, 46, 57, 60, 72, 87 };
		int L = 6;

		System.out.println(maxPoint(arr, L));

	}

 题目二:

普通的解法:

算出可以使用最多8类型袋子M=N/8,然后看剩余苹果是否可以用6类型袋子搞定。不行,尝试M-1个8类型袋子,然后看剩余苹果是否可以用6类型袋子搞定。。。周而复始

如果剩余苹果超过24就不需要进行尝试了,因为前面一定是已经试过的了。【6和8最小公倍数特点】

	public static int minBags(int apple) {
		if (apple < 0) {
			return -1;
		}
		int bag6 = -1;
		int bag8 = apple / 8;
		int rest = apple - 8 * bag8;
		while (bag8 >= 0 && rest < 24) {
			int restUse6 = minBagBase6(rest);
			if (restUse6 != -1) {
				bag6 = restUse6;
				break;
			}
			rest = apple - 8 * (--bag8);
		}
		return bag6 == -1 ? -1 : bag6 + bag8;
	}

	// 如果剩余苹果rest可以被6个苹果的袋子搞定,返回袋子数量
	// 不能搞定返回-1
	public static int minBagBase6(int rest) {
		return rest % 6 == 0 ? (rest / 6) : -1;
	}

题目三: 

预处理之后,后续频繁查询可以很快 => 用空间换时间

	// RGRGR -> RRRGG
	public static int minPaint(String s) {
		if (s == null || s.length() < 2) {
			return 0;
		}
		char[] chs = s.toCharArray(); // 转换成字符串数组
		int[] right = new int[chs.length]; // 开一个数组记录arr[i..N-1]有多少个R
		right[chs.length - 1] = chs[chs.length - 1] == 'R' ? 1 : 0; // 处理最后一个位置R的情况
		for (int i = chs.length - 2; i >= 0; i--) { // 遍历处理从0-N-2每个位置往后R的情况
			right[i] = right[i + 1] + (chs[i] == 'R' ? 1 : 0);
		}
		int res = right[0]; // 一开始没有左边,填涂颜色数就是0-N-1中R需要填涂成G的个数
		int left = 0; // 从0位置开始往后,统计到arr[0..left]有多少个G
		for (int i = 0; i < chs.length - 1; i++) { //遍历数组 
			left += chs[i] == 'G' ? 1 : 0; // 统计G的个数
			res = Math.min(res, left + right[i + 1]);  
		}
		res = Math.min(res, left + (chs[chs.length - 1] == 'G' ? 1 : 0)); // 判断一下将arr[0-N-1]所有G填涂成R的情况
		return res; 
	}

	public static void main(String[] args) {
		String test = "GGGGGR";
		System.out.println(minPaint(test));
	}

题目四: 

	// 设置数组 right 和 down
	// right[i][j] 表示第i行第j列及其往后有多少个连续的1
	// down[i][j] 表示第j列第i行及其往后有多少个连续的1
	public static void setBorderMap(int[][] m, int[][] right, int[][] down) {
		int r = m.length; // 数组行数
		int c = m[0].length; // 数组列数
		if (m[r - 1][c - 1] == 1) { // 特判一下最后一个位置
			right[r - 1][c - 1] = 1; // right数组最后一个位置
			down[r - 1][c - 1] = 1;
		}
		// 处理最后一列的情况
		for (int i = r - 2; i != -1; i--) {
			if (m[i][c - 1] == 1) {
				right[i][c - 1] = 1; // right数组最后一列
				down[i][c - 1] = down[i + 1][c - 1] + 1; // down数组最后一列
			}
		}
		// 处理最后一行的情况
		for (int i = c - 2; i != -1; i--) {
			if (m[r - 1][i] == 1) {
				right[r - 1][i] = right[r - 1][i + 1] + 1; //right数组最后一行
				down[r - 1][i] = 1; // down数组最后一行
			}
		}
		// 处理一般位置的情况
		for (int i = r - 2; i != -1; i--) {
			for (int j = c - 2; j != -1; j--) {
				if (m[i][j] == 1) {
					right[i][j] = right[i][j + 1] + 1;
					down[i][j] = down[i + 1][j] + 1;
				}
			}
		}
	}

	// 返回最大正方形边长
	public static int getMaxSize(int[][] m) {
		int[][] right = new int[m.length][m[0].length];
		int[][] down = new int[m.length][m[0].length];
		setBorderMap(m, right, down);  // 预处理rigth和down辅助数组
		for (int size = Math.min(m.length, m[0].length); size != 0; size--) { // 枚举正方行边长
			// 如果存在这样大小的正方行,直接返回,因为是从大到小尝试,第一个满足条件的一定就是最大的边长
			if (hasSizeOfBorder(size, right, down)) { 
				return size;
			}
		}
		return 0;
	}

	public static boolean hasSizeOfBorder(int size, int[][] right, int[][] down) {
		// 遍历每个点作为正方形的左上方的点
		for (int i = 0; i != right.length - size + 1; i++) { 
			for (int j = 0; j != right[0].length - size + 1; j++) {
				// 如果正方形四条边都有size长度连续为1的部分,返回true,说明找到存在这样的正方形
				if (right[i][j] >= size && down[i][j] >= size
						&& right[i + size - 1][j] >= size
						&& down[i][j + size - 1] >= size) {
					return true;
				}
			}
		}
		return false;
	}

	// 随机生成矩阵
	public static int[][] generateRandom01Matrix(int rowSize, int colSize) {
		int[][] res = new int[rowSize][colSize]; 
		for (int i = 0; i != rowSize; i++) {
			for (int j = 0; j != colSize; j++) {
				res[i][j] = (int) (Math.random() * 2); //生成[0-1]的随机整数
			}
		}
		return res;
	}

	// 打印随机生成的矩阵
	public static void printMatrix(int[][] matrix) {
		for (int i = 0; i != matrix.length; i++) {
			for (int j = 0; j != matrix[0].length; j++) {
				System.out.print(matrix[i][j] + " ");
			}
			System.out.println();
		}
	}

	public static void main(String[] args) {
		int[][] matrix = generateRandom01Matrix(7, 8); // 生成7*8的矩阵
		printMatrix(matrix); // 打印矩阵
		System.out.println(getMaxSize(matrix)); // 打印最大正方行边长
	}

题目五: 

技巧:先加工成01等概率发生器。然后利用二进制位移位进行数字拼凑。

	// 等概率返回1-5的函数
	public static int f() {
		return (int)(Math.random()*5)+1;
	}
	
	// 等概率返回0和1的函数
	public static int r01(){
		int res=0;
		do{
			res=f();
		}while(res==3);
		return res<3?0:1;
	}
	
	// 等该率返回1-7的函数
	public static int g() {
		int res=0;
		do { // 等概率生成0-7
			res=(r01()<<2)+(r01()<<1)+r01();
		}while(res==7); // 如果是7就重新来
		return res+1; // (0-6)+1 => (1-7)
	}

对于第三种情况:两次为一组,如果是0 0 或 1 1,重新来。如果是0 1 则返回 0,如果是 1 0,则返回1。这样返回0和返回1的概率就都是p(1-p),做到了等概率。

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

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

相关文章

用 ChatGPT 写文章、论文,你有哪些绝活?

最强 AI视频生成&#xff1a;小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频百万播放量https://aitools.jurilu.com/绝活不敢说&#xff0c;但是&#xff0c;学会了这个&#xff0c;以前一周写万字&#xff0c;现在两个小时就能搞定&#xff0c;写…

Codeforces EPIC August 2024(Div.1+Div.2) A~E

A. Distanced Coloring &#xff08;思维&#xff09; 题意&#xff1a; 给出一个 n m n\times m nm 网格和一个正整数 k k k。 现在要用用一些颜色为网格着色&#xff0c;并满足以下条件&#xff1a; 如果 ( x 1 , y 1 ) (x_1,y_1) (x1​,y1​) 、 ( x 2 , y 2 ) (x_2…

测试环境频繁报:RedisCommandInterruptedException: Command interrupted

比较奇葩的是&#xff1a;本机&#xff0c;开发&#xff0c;生产都没问题&#xff0c;就测试环境有这问题&#xff0c;导致docker容器不停重启&#xff0c;就是起不来。 本机中断程序&#xff0c;同样也会报这个问题 排查了半天&#xff0c;找到原因&#xff0c;应该是redis在…

技术分享-商城篇-支付回调(十四)

概述 在前面我们说到B2C商城中的订单支付模块&#xff0c;也有聊到支付回调&#xff0c;先来了解一下&#xff0c;为什么我们不能在支付完成当前通知同步去更新支付状态&#xff0c;这样不是更加快捷实时吗&#xff1f;为什么一定要走异步回调通知&#xff1f;带着这些问题&am…

深度学习基础—Batch Norm

对于一个神经网络我们知道&#xff0c;归一化输入特征是加速网络训练的技巧之一&#xff0c;因为归一化后&#xff0c;损失函数的图像就会由狭长变得更圆&#xff0c;那么这是否启发我们&#xff0c;在深度更深模型中&#xff0c;对各层的输出进行归一化&#xff0c;有益于下一…

PythonStudio 控件使用常用方式(三十一)TUpDown

PythonStudio是一个极强的开发Python的IDE工具&#xff0c;官网地址是&#xff1a;https://glsite.com/ &#xff0c;在官网可以下载最新版的PythonStudio&#xff0c;同时&#xff0c;在使用PythonStudio时&#xff0c;它也能及时为用户升到最新版本。它使用的是Delphi的控件&…

从零到一:Spring Boot 与 RocketMQ 的完美集成指南

1.Rocket的概念与原理 RocketMQ 是一款由阿里巴巴开源的分布式消息中间件&#xff0c;最初用于支持阿里巴巴的海量业务。它基于发布-订阅模型&#xff0c;具备高吞吐、低延迟、高可用和强一致性的特点&#xff0c;适用于消息队列、大规模数据流处理等场景。以下是对 RocketMQ …

docker连接宿主机redis,提示Connection refused

目录 一、测试环境 二、问题现象 三、问题总结 一、测试环境 centos 7 redis-5.0.14 docker-26.0.1 二、问题现象 服务器重启后docker连接宿主机redis&#xff0c;提示Connection refused Reconnecting, last destination was /172.25.xxx.x:6379 …

4种回收站数据恢复方法,让数据快速恢复!

回收站里的重要数据怎么突然就消失得无影无踪了&#xff1f;别慌&#xff01;别慌&#xff01;在这里&#xff0c;为您精心准备了4种回收站数据恢复方法&#xff0c;这五种回收站数据恢复方法都是经过实际测试的&#xff0c;完全可以帮我们找回那些被删除的数据&#xff01; 回…

高杰:远程工作8年,平衡了工作与生活,但仍然对收入感到焦虑

这是《开发者说》的第14期&#xff0c;本期我们邀请的开发者是高杰&#xff0c;毕业于上海交大&#xff0c;因拆迁搬家到了郊区&#xff0c;忍受不了长时间的通勤&#xff0c;开始走上远程工作的道路&#xff0c;至今从事远程开发8年有余&#xff0c;他应该是国内最早从事远程工…

C语言提高(2)

calloc void *calloc(size_t namber&#xff0c;size_t size); 功能&#xff1a;在内存动态存储区中分配namber块长度为size字节的连续区域。calloc自动将分配的内存置0 namber&#xff1a;所需内存单元数量 size&#xff1a;每个内存单元的大小&#xff08;单位&#xff1a;字…

第二证券:融券余额,较历史高位下降逾九成!

在多种要素归纳影响下&#xff0c;近年融券余额和转融券余额持续下降&#xff0c;其间融券余额已较前史高位下降逾九成&#xff0c;而转融券余额年内降幅也已逾越九成。 有专家在接受证券时报记者采访时认为&#xff0c;融券和转融券余额大幅减少减轻了商场兜销压力&#xff0…

OV SSL证书:让您的网站与众不同

在当今高度竞争的数字世界中&#xff0c;拥有一个安全、可信的网站对于吸引和保留客户至关重要。组织验证&#xff08;OV&#xff09;SSL证书不仅可以为网站提供强大的加密保护&#xff0c;还能通过验证组织的真实身份来增强用户的信任感。本文将探讨OV SSL证书如何帮助您的网站…

背包问题有前提

前言&#xff1a;这个有大前提的背包感觉不能用二进制拆分&#xff0c;不然搞不清楚 注意三维的顺便&#xff0c;第一维度是枚举物品&#xff0c;第二维度是倒序枚举空间&#xff0c;第三维度是枚举数量 题目地址 #include<bits/stdc.h> using namespace std;#define …

XSS-Jquery.html()+DOM破坏

目录 靶场网址&#xff1a;​ https://xss.pwnfunction.com/challenges/ww3/ ​ 分析代码&#xff1a; Jquery.html()解析原理&#xff1a; DOM-clobbering JS作用域&作用域链 ​编辑 靶场网址&#xff1a;​ https://xss.pwnfunction.com/challenges/ww3/ ​ 分析代…

全液冷服务器革命:CPU、内存、PCIe高效散热新方案

在国家十四五规划大力发展数字经济的背景下&#xff0c;数据中心作为算力的核心载体&#xff0c;其基础设施成为支撑数字经济的“数字底座”&#xff0c;但同时也面临巨大的碳排放压力。随着芯片与服务器功耗的上升&#xff0c;单机柜功率密度不断增大&#xff0c;传统风冷散热…

RF自动化环境安装+自动化实例解析

RF定义&#xff1a; 通用型的 自动测试框架&#xff0c; 绝大部分的软件的的自动化系统都可以采用它。 特点&#xff1a; 测试数据文件&#xff08;Test Data&#xff09;对应一个个的测试用例。测试数据文件里面使用的功能小模块叫关键字&#xff0c;由测试库&#xff08;T…

【生日视频制作】教师节中秋节国庆节红色直升飞机AE模板修改文字软件生成器教程特效素材【AE模板】

红色直升飞机生日视频制作教程AE模板改文字广软件告生成器素材 怎么如何做的【生日视频制作】教师节中秋节国庆节红色直升飞机AE模板修改文字软件生成器教程特效素材【AE模板】 生日视频制作步骤&#xff1a; 安装AE软件下载AE模板把AE模板导入AE软件修改图片或文字渲染出视频…

字节跳远,AI绘梦:我的自由之旅,从编码到画布的奇幻转变

一、告别字节&#xff0c;开启未知旅程 在字节跳动的那些日子里&#xff0c;我经历了职场的起伏&#xff0c;也见证了公司的飞速发展。然而&#xff0c;高强度的工作节奏和不断攀升的业绩压力&#xff0c;让我开始思考生活的意义。最终&#xff0c;我做出了一个大胆的决定——裸…

Leetcode面试经典150题-300.最长递增子序列

解法都在代码里&#xff0c;不懂就留言或者私信 面试的话普通的动态规划解法就够了&#xff0c;如果要出彩&#xff0c;看看我提交的最终的解 class Solution {/**解题思路分析&#xff1a;这个题的普通解法是标准的动态规划对于每一个位置的值&#xff0c;看看前面所有的比它…