我在一次采访中遇到了以下问题。
给定一个数组,您需要找到所有元素小于给定值 k 的子数组
,例如
if k=4,
arr[]={4,8,2,4,6}
现在,值小于 4 的子数组是:
1.{4}
2.{2}
3.{2,4}
注意{4}是如何重复的,但没有考虑两次。现在,代码应该返回不同子阵列的计数
在本例中为3.
另一个示例:
k=4
arr[]={2,3,8,2,4,6}
不同的子阵列:
1.{2}
2.{3}
3.{2,3}
4.{4}
5.{2,4}
我的方法是找到小于给定值k(即O(n^2))的子阵列,然后将其插入类似无序集的内容中以删除重复项。
有没有解决这个问题的有效方法?
因此,在摆弄了几分钟之后,我终于想出了一个解决方案,即使您的结果与我的结果不同,也要逐字逐句地满足您所说的内容。在你的问题中,你清楚地说:
给定一个数组,找出所有元素小于给定值k的不同子数组。
您给出了我在解决方案中使用的以下示例。
k=4
arr[]={2, 3, 8, 2, 4, 6}
你得出结论,结果应该是:
1.{2}
2.{3}
3.{2,3}
4.{4}
5.{2,4}
实际上,如果您的要求真正得到满足,您将只有三个不同的数组,因为元素必须小于k
的提供值,在本例中为4
:
The values are: 2,3,8,2,4,6
Distinct Arrays Are: {2} {3} {2,3}
解决方案(在C#6.0中)
请随意在. NET Fiddle(需要调整到C#4.5)或Visual Studio(目前处理C#6.0)中进行测试。我不确定如何将其转换回数学公式,如果这是您最终需要的,但此解决方案可以根据所需结果的描述工作。
using System;
using System.Collections.Generic;
public class Program {
static int k = 4;
static int[] vals = new int[]{ 2, 3, 8, 2, 4, 6 };
static List<string> distinctVals = new List<string>();
public static void Main() {
Console.WriteLine($"The values are: {string.Join(",", vals)}");
for (int x = 0; x < vals.Length; x++) {
if (vals[x] < k)
if (!distinctVals.Contains(vals[x].ToString()))
distinctVals.Add(vals[x].ToString());
for (int y = 0; y < vals.Length; y++) {
if (vals[y] < k) {
if (!distinctVals.Contains(vals[y].ToString()))
distinctVals.Add(vals[y].ToString());
if (vals[x] < k && vals[x] != vals[y])
if (!distinctVals.Contains($"{vals[x]},{vals[y]}"))
if (!distinctVals.Contains($"{vals[y]},{vals[x]}"))
distinctVals.Add($"{vals[x]},{vals[y]}");
}
}
}
Console.WriteLine($"There are {distinctVals.Count} distinct array elements.");
Console.Write($"The distinct elements are: {{{string.Join("}; {", distinctVals)}}};");
}
}
给定一个(未排序的)数组S和一些整数k,找到对的数量i, j使得S的范围[i... j] 我在一次采访中收到了这个问题,经过排序后只能得出一个O(nlogn)解。但是,有人告诉我有一个O(n)解。有什么想法吗?
我知道一个O(n2)soln,它能以更好的方式实现吗,因为数组中元素的数量限制非常大
所以我正在研究一个Leetcode问题,我的代码在某些情况下有效,但在某些情况下失败。 问题是: 给定一个矩阵,其中每个行和列都按升序排序,找出矩阵中第k个最小的元素。 请注意,它是排序顺序中的第k个最小元素,而不是第k个独立元素。 例子: 返回: 13 我的方法是使用minHeap,即使它声明数组已经排序,我仍然需要确保我已经将它从最小值排序到最大值。 这是我的代码: 以下是我的意见: 以下是输
我使用最大堆来查找数组中的k个最大元素,如下所示: 1) 我已经构建了给定数组的前k个元素(arr[0]到arr[k-1])的最小堆MH。O(k) 2)对于每个元素,在第k个元素(arr[k]到arr[n-1])之后,将其与MH的根进行比较。 ……a)如果元素大于根,则将其设为根,并为MH调用heapify ……b)否则忽略它。 //步骤2是O((n-k)) 3)最后,MH有k个最大元素,MH的根
我看到一个问题,要求它找到所有相邻子阵列的最小值。例如,对于数组A=[1,2,3],答案将是一个包含[1,2,3,1,2,1]的数组B<怎么做- 我所做的是,构建了一个段树,但是它不包含所有连续子数组的最小值。 我也不认为我可以使用“脱钩”,因为我不必在特定长度的子数组中找到最小值。 那么,我如何获得所有连续子阵列(B阵列)的最小值?
这是一个面试问题。 在具有排序行和列的矩阵中找到Kth最小元素。 Kth最小元素是中的一个,例如,这是否正确?