博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
腾讯2020-05春招补录笔试(刷板问题)
阅读量:3961 次
发布时间:2019-05-24

本文共 1661 字,大约阅读时间需要 5 分钟。

腾讯2020-05春招补录笔试

在这里插入图片描述

这个题可以按分治思想,把问题简化为找到最小值,分成两部分,在每个部分内继续找最小值划分
首先看一下算法分析:

我们有两种刷法,横着刷与竖着刷

核心思想就是利用上面两种方法把最短的刷完递归
①只利用横着刷把最短刷完然后递归
为什么要全用横着刷而不是横竖混刷?
因为如果第一次横着刷以后再竖着刷的话,接下来就是递归,
如果在子问题中先横着刷的话那么还不如在上一次中直接横着再刷一道,这样并不会影响总次数。
如果子问题竖着刷的话,接着递归在新的子问题中如果横着刷的话还不如在上一次的上一次中直接横着再刷一道,这样并不会影响总次数。
那么一直这样分析下去最后我们发现结果就是横着刷把最短刷完然后递归
②竖着一次刷完最短然后递归

import org.junit.Test;public class AVL {
@Test public void Test() {
int array[]={
1,1,9999,1,1}; System.out.println(BrushSticks(array,0,4,0)); } //算法的思想就是分治法 //刷的方法分为两种横刷与竖刷代表将left-right范围内的值减去dx //递归的出口是left>right int BrushSticks(int array[],int left ,int right,int dx){
if(left>right){
return 0; }else{
//横着全部刷完 int min_index = Find_MiniIndex(array,left,right); //由于这一下刷下去可能会存在一样的最小短板 int nums = 0; int a,b; int i = left; //将各个子区间递归 while(i<=right){
while(i<=right&&array[i]==array[min_index]){
i++; } a=i; while(i<=right&&array[i]>array[min_index]){
i++; } b=i-1; nums+=BrushSticks(array,a,b,array[min_index]+dx); } nums+=array[min_index]-dx; //直接竖着刷 int nums1=BrushSticks(array,left,min_index-1,dx)+BrushSticks(array,min_index+1,right,dx)+1; return (nums>nums1)?nums1:nums; } } int Find_MiniIndex(int[] arr,int left,int right){
int min = arr[left]; int min_index = left; for(int i=left;i<=right;i++){
if(arr[i]

转载地址:http://gplzi.baihongyu.com/

你可能感兴趣的文章
JAVA中各类CACHE机制实现的比较 [转]
查看>>
PL/SQL Developer技巧
查看>>
3-python之PyCharm如何新建项目
查看>>
15-python之while循环嵌套应用场景
查看>>
17-python之for循环
查看>>
18-python之while循环,for循环与else的配合
查看>>
19-python之字符串简单介绍
查看>>
20-python之切片详细介绍
查看>>
P24-c++类继承-01详细的例子演示继承的好处
查看>>
P8-c++对象和类-01默认构造函数详解
查看>>
P1-c++函数详解-01函数的默认参数
查看>>
P3-c++函数详解-03函数模板详细介绍
查看>>
P4-c++函数详解-04函数重载,函数模板和函数模板重载,编译器选择使用哪个函数版本?
查看>>
P5-c++内存模型和名称空间-01头文件相关
查看>>
P6-c++内存模型和名称空间-02存储连续性、作用域和链接性
查看>>
P9-c++对象和类-02构造函数和析构函数总结
查看>>
P10-c++对象和类-03this指针详细介绍,详细的例子演示
查看>>
bat备份数据库
查看>>
linux数据库导出结果集且比对 && grep -v ---无法过滤的问题
查看>>
shell函数与自带变量
查看>>