出题:将一个数组最开始的k个(K小于数组大小N)元素照搬到数组末尾,我们称之为数组的旋转;现在有一个已经排序的数组的一个旋转,要求输出旋转数组中的最小元素,且时间复杂度小于O(N);

分析:

  • 时间复杂度小于O(N)也就是不能用常规的遍历思路;可以将数组看成两个都是递增序列(假设为升序)的子数组,并且前半段的元素均大于等于后半段的元素,分界点的位于后半段数组的第一个元素就是最小元素;
  • 具体算法:两个指针left和right指向数组第一个和最后一个元素,使用Binary Search确定中间元素middle,如果middle小于left说明其在后半段,则right=middle;如果middle大于right说明 其在前半段,则left=middle,最终left和right会逼近前后段数组的分界点,所以可以找到最小元素,时间复杂度为O(logN);

解题:

 int findMinimumRatatingArray(int *array, int length) {
int left=;
int right=length-; int middle;
while(true) {
middle=(left+right)/;
if(right-left == ) {
middle=right;
break;
} if(array[middle]>=array[left])
right=middle;
if(array[middle]<=array[right])
left=middle;
}
return array[middle];
}

出题:N个骰子扔在地上,所有骰子的朝上一面的值和为S,要求确定S所有可能出现的值的概率;

分析:

  • 一个骰子有6个面,所以有6个值,每个值出现的概率为1/6;对于N个骰子,S的取值范围是[N,6N],统计N到6N之间每一个数出现的次数,然后除以 6^N就是最后每个数出现的概率;
  • 使用递归函数,设定当前骰子的值,然后调用递归函数处理下一个骰子的值,直到处理完所有的骰子,最后计算所有骰子的值。 当N较大的之后,递归函数占用大量内存,所以可以考虑将递归转换为循环实现;

解题:

 void diceProbability(int *array, int n, int index, int *sumArray) {
if(index==n) {
int sum=;
for(int i=;i<n;i++)
sum+=array[i];
sumArray[sum-n]+=;
} else {
for(int i=;i<-;i++) {
array[index]=i;
diceProbability(array, n, index+, sumArray);
}
}
}

笔试算法题(22):二分法求旋转数组最小值 & 骰子值概率的更多相关文章

  1. 笔试算法题(09):查找指定和值的两个数 & 构造BST镜像树

    出题:输入一个已经升序排序的数组和一个数字:要求在数组中查找两个数,这两个数的和正好等于输入的那个数字,输出任意一对数字就可以,要求时间复杂度是O(n): 分析:对于升序排序的数组{…i…j…k…m… ...

  2. leecode刷题(3)-- 旋转数组

    leecode刷题(3)-- 旋转数组 旋转数组 给定一个数组,将数组中的元素向右移动 K 个位置,其中 K 是非负数. 示例: 输入: [1,2,3,4,5,6,7] 和 k = 3 输出: [5, ...

  3. 【C语言】求旋转数组的最小数字,输入一个递增排序的数组的一个旋转,输出其最小元素

    //求旋转数组的最小数字,输入一个递增排序的数组的一个旋转,输出其最小元素 #include <stdio.h> #include <string.h> int find_mi ...

  4. 笔试算法题(26):顺时针打印矩阵 & 求数组中数对差的最大值

    出题: 输入一个数字矩阵,要求从外向里顺时针打印每一个数字: 分析: 从外向里打印矩阵有多重方法实现,但最重要的是构建合适的状态机,这样才能控制多重不同的操作: 注意有四种打印模式(左右,上下,右左, ...

  5. 笔试算法题(40):后缀数组 & 后缀树(Suffix Array & Suffix Tree)

    议题:后缀数组(Suffix Array) 分析: 后缀树和后缀数组都是处理字符串的有效工具,前者较为常见,但后者更容易编程实现,空间耗用更少:后缀数组可用于解决最长公共子串问题,多模式匹配问题,最长 ...

  6. 前端如何应对笔试算法题?(用node编程)

    用nodeJs写算法题 咱们前端使用算法的地方不多,但是为了校招笔试,不得不针对算法题去练习呀! 好不容易下定决心 攻克算法题.发现js并不能像c语言一样自建输入输出流.只能回去学习c语言了吗?其实不 ...

  7. 剑指offer六之求旋转数组的最小数字

    一.题目 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个 ...

  8. 求旋转数组的最小数字(剑指offer)

    把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数 ...

  9. 笔试算法题(32):归并算法求逆序对 & 将数组元素转换为数组中剩下的其他元素的乘积

    出题:多人按照从低到高排成一个前后队列,如果前面的人比后面的高就认为是一个错误对: 例如:[176,178,180,170,171]中的错误对 为 <176,170>, <176,1 ...

随机推荐

  1. 【179】IDL 读写 NetCDF 文件

    NetCDF(network Common Data Form)由位于科罗拉多州波尔市的 Unidata 程序中心开发,主要应用于大气科学的研究.NetCDF 的数据模式具有简单性和灵活性的特点.Ne ...

  2. (转)C#中数组、ArrayList和List三者的区别

    原文地址:http://blog.csdn.net/zhang_xinxiu/article/details/8657431 在C#中数组,ArrayList,List都能够存储一组对象,那么这三者到 ...

  3. bzoj 1863: [Zjoi2006]trouble 皇帝的烦恼【二分+dp】

    二分答案,注意l是max(a[i]+a[i+1]),r是sum_a 判断的时候用dp,设f[i]为i与1最少的相同颜色数,g[i]为i与1最多的相同颜色数,转移是f[i]=max(a[i]-(w-a[ ...

  4. [UOJ311]积劳成疾

    题解 dp 似乎这个最大值不好设计状态啊== 但是可以发现这\(n\)个点每个点都是相同的 可以设计状态\(f_{i,j}\)表示一个长度为\(i\)的一段区间的最大值不会超过\(j\)的价值 那么转 ...

  5. Drawable(7)让一个没有pressed状态的控件使用StateList,显示pressed图片。

    TextView没有按下状态,Button有. 如图1,内容1在一个TextView上,默认它并没有按下状态. 如何让TextView有呢. 在xml中加入属性: android:clickable= ...

  6. java数组实现买彩票(阿基老师的打乱排序思想)

    package com.wh.array; public class Lottery { public static void main(String[] args) { int[] num=new ...

  7. 424 Longest Repeating Character Replacement 替换后的最长重复字符

    给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 k 次.在执行上述操作后,找到包含重复字母的最长子串的长度.注意:字符串长度 和 k 不会超过 104. ...

  8. 在Paint事件中绘制控件(边框)

    单纯的自己记录,将来会继续添加,侥幸被大家发现了的话请不要太鄙视... private void panel4_Paint(object sender, PaintEventArgs e) { Con ...

  9. AJPFX:关于面向对象及java的一些机制的思考

    1.变量的作用域和生命周期什么关系? 2.java除了在类体和方法体(包括参数)中可以声明变量外,其他位置一定不可以声明变量吗?比如高级别的应用里是不是有例外呢? 3.java源文件中代码的组织方式一 ...

  10. 直接插入排序法原理及其js实现

    直接插入排序法就像我们打扑克牌时整理牌面一样,先让我们脑补一下我们打牌的过程. 首先摸了一张6, 接着摸到一张4,比6小,插到6的前面: 又摸到一张7,比6大,插到6的后面: 又摸到一张5,比6小,比 ...