- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在研究 Codility Peak problem :
Divide an array into the maximum number of same-sized blocks, each of which should contain an index P such that A[P - 1] < A[P] > A[P + 1].
下面提供了我自己的解决方案,但它只获得了 45% 的分数。所以我的问题是:
如何改进我的解决方案?
代码片段似乎很长,因为我添加了一些额外的注释以使自己更清楚:
function solution(A) {
var storage = [], counter = 0;
// 1. So first I used a loop to find all the peaks
// and stored them all into an array called storage
for(var i = 1; i < A.length - 1; i++) {
if (A[i] > A[i-1] && A[i] > A[i+1]) {
storage.push(i);
}
}
// 2. Go and write the function canBeSeparatedInto
// 3. Use the for loop to check the counter
for(var j = 1; j < A.length; j++) {
if (canBeSeparatedInto(j, A, storage)) {
counter = j;
}
}
return counter;
}
/* this function tells if it is possible to divide the given array into given parts
* we will be passing our function with parameters:
* @param parts[number]: number of parts that we intend to divide the array into
* @param array[array]: the original array
* @param peaks[array]: an storage array that store all the index of the peaks
* @return [boolean]: true if the given array can be divided into given parts
*/
function canBeSeparatedInto(parts, array, peaks) {
var i = 1, result = false;
var blockSize = array.length / parts;
peaks.forEach(function(elem) {
// test to see if there is an element in the array belongs to the ith part
if ((elem+1)/blockSize <= i && (elem+1)/blockSize> i-1) {
i++;
}
});
// set the result to true if there are indeed peaks for every parts
if (i > parts) {
result = true;
}
return result;
}
我的代码的主要问题是它没有通过性能测试。你能给我一些提示吗?
最佳答案
我会建议这个算法:
根据他们与前任的距离对 peeks 进行排序。为此,识别“谷”可能更直观,即没有窥视的最大化范围,并按大小降序对它们进行排序
确定数组长度的除数,因为解必须是其中之一。例如,当数组长度为质数时,测试解决方案是浪费时间:在这种情况下,答案只能是 1(如果没有 peeks,则为零)。
按升序尝试每个除数(代表数组 block 的大小),看看对于每个谷,这样的拆分是否会将其中一个 block 完全带入该谷内,即它不会包含 peek :在那种情况下,拒绝该尺寸作为解决方案,并尝试下一个尺寸。
数组交互输入的实现:
"use strict";
// Helper function to collect the integer divisors of a given n
function divisors(n) {
var factors = [],
factors2 = [],
sq = Math.sqrt(n);
for (var i = 1; i <= sq; i++) {
if (n % i === 0) {
factors.push(n / i);
// Save time by storing complementary factor as well
factors2.push(i);
}
}
// Eliminate possible duplicate when n is a square
if (factors[factors.length-1] === factors2[factors2.length-1]) factors.pop();
// Return them sorted in descending order, so smallest is at end
return factors.concat(factors2.reverse());
}
function solution(A) {
var valleys = [],
start = 0,
size, sizes, i;
// Collect the maximum ranges that have no peeks
for (i = 1; i < A.length - 1; i++) {
if (A[i] > A[i-1] && A[i] > A[i+1]) {
valleys.push({
start,
end: i,
size: i - start,
});
start = i + 1;
}
}
// Add final valley
valleys.push({
start,
end: A.length,
size: A.length - start
});
if (valleys.length === 1) return 0; // no peeks = no solution
// Sort the valleys by descending size
// to improve the rest of the algorithm's performance
valleys.sort( (a, b) => b.size - a.size );
// Collect factors of n, as all chunks must have same, integer size
sizes = divisors(A.length)
// For each valley, require that a solution must not
// generate a chunk that falls completely inside it
do {
size = sizes.pop(); // attempted solution (starting with small size)
for (i = 0;
i < valleys.length &&
// chunk must not fit entirely inside this valley
Math.ceil(valleys[i].start / size) * size + size > valleys[i].end; i++) {
}
} while (i < valleys.length); // keep going until all valleys pass the test
// Return the number of chunks
return A.length / size;
}
// Helper function: chops up a given array into an
// array of sub arrays, which all have given size,
// except maybe last one, which could be smaller.
function chunk(arr, size) {
var chunks = [];
for (var i = 0; i < arr.length; i += size) {
chunks.push(arr.slice(i, i + size));
}
return chunks;
}
// I/O management
inp.oninput = function () {
// Get input as an array of positive integers (ignore non-digits)
if (!this.value) return;
var arr = this.value.match(/\d+/g).map(v => +v);
var parts = solution(arr);
// Output the array, chopped up into its parts:
outCount.textContent = parts;
outChunks.textContent = chunk(arr, arr.length / parts).join('\n');
}
Array (positive integers, any separator): <input id="inp" style="width:100%">
Chunks: <span id="outCount"></span>
<pre id="outChunks"></pre>
关于javascript - Codility Peak JavaScript 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45830256/
我想编写一个程序,在系统的基本声音播放任何类型的声音时执行特定的命令。就像您在Facebook上收到消息一样,您会听到一些警报声。我想认识这个“高峰”。在python中怎么可能? 最佳答案 获取音频数
我有一组数据,我想找到一个平均峰值。我已经在 Numbers.app 中做了一些测试,看看我在做什么,如果我制作数据集的图表,它有一个称为“多项式趋势线”的功能,它绘制数据曲线和该曲线的峰值看起来就像
我想知道在 2D 灰度垫中找到所有峰和谷的最佳方法是什么? 我发现只有 opencv 函数可以在 Mat 中找到局部极值,但不能找到所有的峰和谷。 所以我尝试找出我自己的算法,但我希望有一种方法(已经
我刚刚完成了以下 Codility Peaks问题。问题如下: 给定一个由 N 个整数组成的非空零索引数组 A。峰是比其邻居大的数组元素。更准确地说,它是一个索引 P,使得 0 A[P + 1]。例
我正在尝试制作一个非常简单的 Android 计步器,但到目前为止它的失败非常严重。我在互联网上得到了一些建议,但似乎没有任何效果。 我主要是设置加速度传感器并获取 x、y 和 z 轴的值。之后我计算
我有机会拿到一副谷歌眼镜。现在我正在尝试使用 GDK 构建一个简单的应用程序,它执行以下操作: 通过语音命令启动应用程序 (WORKS) 在 API 中搜索问题 (WORKS) 在静态卡片中显示结果(
我正在研究 Codility Peak problem : Divide an array into the maximum number of same-sized blocks, each of
我正在尝试解决最新的 codility.com 问题(只是为了提高我的技能)。我试过分配但没有得到超过 30 分,所以现在很好奇我的解决方案中到底缺少什么。 问题是 给定一个由 N 个整数组成的非空零
我遇到2个函数(HTTPlib库的main和svr.Get(...))之间的share_ptr问题。 我使用以下方法声明了指针: std::shared_ptr dataStream; 我正在使用ma
在 iPhone X 上的 iOS11 中,我在删除 peek 空间时遇到问题。 空间在top和stackview之间。白色间隙是 View Controller 上的 Root View 。 约束设
我在 MySQL 中有一个表,记录了客户花费的时间,我需要找到最繁忙的 30 分钟。 CREATE TABLE Customer (id int NOT NULL AUTO_INCREMENT
因为一些意外redis内存增加了很多,我们删除了很多不用的key,但是内存没有释放,有没有办法手动释放,除了重启redis。 redis 信息 # Memoryused_memory:14166381
对于一维数组中的峰值查找问题,为什么编码为如果 array[mid] 小于 a[mid-1] ,则数组的左侧部分肯定包含峰值元素,并且如果 array[mid]大于a[mid-1],那么峰值元素在数组
我正在使用端口音频在我的 PC 上(介于 -1 和 +1 之间)获取 32 位 float 音频(44.1Khz),并使用 fftw 获取它的 fft。 现在我需要获取 16 位 int 音频并获取其
我正在尝试重建这个算法: http://courses.csail.mit.edu/6.006/fall10/lectures/lec02.pdf (第14页“算法二”) (用谷歌找到这个,不幸的是我
事件监视器(又名内存监视器)是 Xcode Instruments 中唯一可以测量在模拟器中运行的 iPhone 应用程序的总应用程序 RAM 使用情况的工具吗?只是那行显示瞬时有线 RAM? 与 i
我有点疯了。我从午餐介绍场景那里得到了一个 AppDelegate。我使用 TexturePacker 获取 plist 和 png 文件使用 RGBA4444 像素格式,并在 XCode 中将“压缩
我是一名优秀的程序员,十分优秀!