标签: array-algorithms

找到任意子数组中所有项的总和的最佳算法是什么

我有一个问题,一个OK-ish解决方案.我希望那里有更好的解决方案.

问题

我有一个大约200,000个整数的数组.给定两个索引i1和i2,我需要计算i1和i2之间所有元素的总和.数组中的每个整数都介于1和4之间.例如:

a = [1, 3, 2, 4, 3, 2, 4, 1];
subsection_sum(a, 0, 3); // returns 6: (1 + 3 + 2)
Run Code Online (Sandbox Code Playgroud)

此操作将执行大约200,000次,因此需要非常快.for循环中的一个简单计数器是O(n),而且太慢了.在构建之后,阵列永远不会被修改,因此可以拥有相对昂贵的预处理阶段.

迄今为止我的最佳解决方案

该算法在O(log n)时间内工作:

首先用零填充原始数组,直到其长度为2的幂.接下来,将数组拆分为两个相等的部分并存储每个的总和.然后将数组拆分为四分之一并存储每个数组的总和.然后是八分之一.继续这样做,直到数组被分成2个元素长的部分.对于上面的8元素数组,这需要两个步骤:

halves = [(a[0] + a[1] + a[2] + a[3]), (a[4] + a[5] + a[6] + a[7])]
quarters = [(a[0] + a[1]), (a[2] + a[3]), (a[4] + a[5]), (a[6] + a[7])]
Run Code Online (Sandbox Code Playgroud)

然后给出两个索引,现在可以在O(log n)时间内计算出subsection_sum.例如,subsection_sum(a,2,7)== quarters [1] + halfves [1].

algorithm sum array-algorithms

6
推荐指数
1
解决办法
3174
查看次数

计算二叉树的单个垂直线中的节点总和

对于二叉树,我想获得落在单个垂直线中的所有节点的总和。我想要每个垂直节点中的节点总和

             A
           /    \
          B      C
         /  \   /  \
         D   E  F   G
        / \ 
        H  I
Run Code Online (Sandbox Code Playgroud)

如果你看上面的 T 恤

line 0   A  E F   so sum  = A+E+F
line -1  B I      so sum = B +I
line 1   C        so sum = C
line 2   G        so sum = G
Run Code Online (Sandbox Code Playgroud)

我实现了以下算法

Map<Integer,Integere> mp = new HashMap<Integer,Integer>()
calculate(root,0); 

 void calculate(Node node, int pos){
   if(node==null)
        return ;
  if(mp.containsKey(pos) ){
    int val = mp.get(pos) + node.data;
     mp.put(pos,val);
    }
    else{ 
         mp.put(pos,node.data); …
Run Code Online (Sandbox Code Playgroud)

array-algorithms

5
推荐指数
1
解决办法
2523
查看次数

排序坐标点c ++

在一个应用程序中,我测量了一个模式的很多2d坐标(x,y).该图案由网格上的一组点组成,在x和y方向上具有固定的间距.这些坐标都有质量分数,并按此分数排序.我想要做的是首先在x上排序这些坐标,并定义属于一起的x坐标的组(区域).在此步骤之后,我想对y区域中的不同x区域进行排序.

在此之后,我能够将坐标标记为相应的图案(网格)标签.

示例:测量坐标(x,y)=(2,2),(2,3),(1,2),(1,3),(2,1),(1,1),(3,2) ),(3,3),(3,1)

在步骤1之后:(x,y)=(1,2),(1,3),(1,1)(2,2),(2,3),(2,1)(3,2), (3,3),(3,1)

在第2步之后:(x,y)=(1,1),(1,2),(1,3),(2,1),(2,2),(2,3),(3,1) ),(3,2),(3,3)

是否有已执行此任务的排序例程?如果不测量图案的某些坐标,例程也应该有效.

有人可以给我一些线索,我不是一个经验丰富的c ++程序员,但也许有一些提示我可以做这个工作!

c++ algorithm data-structures array-algorithms

5
推荐指数
3
解决办法
2万
查看次数

为什么归并排序最多有 6 n log n 数组访问?

我正在观看 Coursera 普林斯顿算法关于合并排序的讲座,我理解所有分析,除了最​​多 6 n log n 数组访问的合并。

为什么是 6?

sorting algorithm mergesort array-algorithms

5
推荐指数
1
解决办法
764
查看次数

数组中的最大元素,等于数组中两个元素的乘积

我们需要在数组中找到最大元素,该元素也等于同一数组中两个元素的乘积.例如[2,3,6,8],这里6 = 2*3,所以答案是6.

我的方法是对数组进行排序,然后使用两个指针方法检查每个元素是否存在产品.这是o(nlog(n))+ O(n ^ 2)= O(n ^ 2)方法.有更快的方法吗?

array-algorithms

5
推荐指数
1
解决办法
4764
查看次数

如何优化我的代码以交换给定范围的索引的数组元素与相关元素?

考虑具有N个元素的整数数组A,其中每个元素与另一个数组元素具有一对一的关系.

对于每个i,其中1≤i≤N,在元素i和元素N-i + 1之间存在1-> 1的关系

任务是对此阵列执行以下操作,如下所示:

给定两个整数(L,R),我们必须将该范围内的每个元素与其相关元素交换.(参见下面的示例说明)

样本输入

5
1 2 3 4 5
2
1 2
2 3
Run Code Online (Sandbox Code Playgroud)

样本输出

5 2 3 4 1
Run Code Online (Sandbox Code Playgroud)

解释对于第一个查询,我们将1与5和2交换为4.现在数组变为 - 5 4 3 2 1

同样现在,对于第二个查询,我们将4与2和3交换.所以最终的阵列将是5 2 3 4 1

我的程序是这样的:

import java.util.Scanner;
public class ProfessorAndOps {

public static void main(String[] args) {
    // TODO Auto-generated method stub

    Scanner in=new Scanner(System.in);
    int n=in.nextInt();//length of array
    int a[]=new int[n];//array declaration
    for(int i=0;i<n;i++){
        //inputting array elements
        a[i]=in.nextInt();
    }
    int q=in.nextInt();//number of queries
    for(int i=0;i<q;i++){
        int …
Run Code Online (Sandbox Code Playgroud)

java arrays algorithm optimization array-algorithms

5
推荐指数
1
解决办法
580
查看次数

在java中查找n个数组之间的公共元素之和

我有一个程序,它总结了两个数组的共同元素.为此,我使用了两个for循环,如果我有三个,那么我可以使用三个for循环.但是如何总结运行时n中n个数组的公共元素.

我不知道如何在运行时更改循环次数,还是有任何其他相关概念?

这是我试图总结两个数组的代码:

import java.util.Scanner;

public class Sample {
    public static void main(String... args)
    {
        Scanner sc=new Scanner(System.in);
        int arr1[]={1,2,3,4,5},arr2[]={4,5,6,7,8},sum=0;
        for (int i=0;i<arr1.length;i++)
        {
            for (int j=0;j<arr2.length;j++)
            {
                if (arr1[i]==arr2[j])
                {
                    sum+=(arr1[i]);
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

java arrays algorithm data-structures array-algorithms

5
推荐指数
1
解决办法
784
查看次数

在 nlog(n) 时间内对整数数组进行排序,而不使用比较运算符

想象一下,有一个整数数组,但不允许您访问任何值(因此不允许Arr[i] > Arr[i+1]或其他)。区分整数的唯一方法是使用query()函数:该函数将元素子集作为输入,并返回该子集中唯一整数的数量。目标是根据整数的值将它们分成组 \xe2\x80\x94 同一组中的整数应具有相同的值,而不同组中的整数应具有不同的值。\n问题 - 代码必须是 O( nlog(n)),或者换句话说,query() 函数只能被调用 O(nlog(n)) 次。

\n

我花了几个小时在 Python 中优化不同的算法,但所有这些算法的复杂度都是 O(n^2)。作为参考,这是我开始的代码:

\n
n = 100\nquerycalls = 0\nsecretarray = [random.randint(0, n-1) for i in range(n)]\ndef query(items):\n    global querycalls\n    querycalls += 1\n    return len(set(items))\ngroups = []\n
Run Code Online (Sandbox Code Playgroud)\n

secretarray生成一个长度为 的巨大随机数字列表nquerycalls跟踪函数被调用的次数。groups是结果所在。

\n

我做的第一件事是尝试创建一个基于合并排序的算法(将数组拆分,然后根据 query() 值合并),但我永远无法使其低于 O(n^2)。

\n

arrays algorithm optimization big-o array-algorithms

5
推荐指数
1
解决办法
491
查看次数

最长的连续子阵列,平均值大于或等于k

考虑一个N个整数的数组.找到最长的连续子阵列,使其元素的平均值大于(或等于)给定数量k.

显而易见的答案是O(n ^ 2)复杂度.我们可以做得更好吗?

algorithm array-algorithms

4
推荐指数
1
解决办法
3924
查看次数

如何删除数组中的"null"元素?

我目前正在做一个编码挑战,声明:

给定一个单词列表,返回可以在美国键盘的一行上使用字母表键入的单词,如下图所示(这是QWERTY键盘的图像).

例:

Input: ["Hello", "Alaska", "Dad", "Peace"]
Output: ["Alaska", "Dad"]
Run Code Online (Sandbox Code Playgroud)

我为解决这个问题所做的是编写一个for循环,然后执行if将所有行(如QWERTY)替换为的语句,""如果它的长度大于1,则不能在一行中键入该单词.我得到几乎正确的输出,但我的数组包含null元素.

我的输出是:

[null,"Alaska","Dad",null]
Run Code Online (Sandbox Code Playgroud)

如何返回没有这些null元素的数组?为了完成这个挑战,我必须返回一个String[]数组.我不能用一个ArrayList回来.

class Solution {
    public String[] findWords(String[] words) {
    String[] result = new String[words.length];

    String row1 = "qwertyuiop";
    String row2 = "asdfghjkl";
    String row3 = "zxcvbnm";

    for (int i = 0 ; i < words.length; i++) {
        if (words[i].toLowerCase().replaceAll("[" + row1 + "]", "").length() == 0 ||
           words[i].toLowerCase().replaceAll("[" + row2 + "]", "").length() == 0 ||
           words[i].toLowerCase().replaceAll("[" + …
Run Code Online (Sandbox Code Playgroud)

java arrays algorithm array-algorithms

4
推荐指数
2
解决办法
617
查看次数