我想做一个算法,在leetcode上发现了这个问题
给定一个整数数组,找到两个数字,使它们相加为一个特定的目标数。
函数twoSum应该返回两个数字的索引,使它们相加为目标,其中index1必须小于index2。请注意,您返回的答案(index1和index2)都不是从零开始的。
输出:index1=1,index2=2
我的解是O(n^2)。我想知道有没有更好的办法?如O(n)或O(nlogn)
import java.util.Arrays;
public class ReturnIndex {
public int[] twoSum(int[] numbers, int target) {
int tail = numbers.length-1;
int[] n = new int[2];
for (int i=0;i<tail;i++) {
for(int j=i+1;j<tail;j++) {
if(target ==(numbers[i]+numbers[j])) {
n[0] = i+1;
n[1] = j+1;
}
}
}
return n;
}
public static void main(String[] args) {
int[] s = {150,24,79,50,88,345,3};
int value = 200;
ReturnIndex r = new ReturnIndex();
int[] a = r.twoSum(s,value);
System.out.println(Arrays.toString(a));
}
}
O(n log n)
时间,O(1)
内存(不计算列表):
>
首先,对列表进行排序。这需要o(n logn)
时间,就像大多数排序函数一样。
遍历列表,这应该在外循环中花费O(n)
时间。此时,您可以对排序子列表中最接近的匹配整数进行二分搜索,这将花费O(log n)
时间。此阶段应以O(n logn)
总计结束。
O(n)
时间,O(n)
内存:
构建一个哈希表,该哈希表应具有O(1)
插入和O(1)
包含。然后,在O(n)
外循环中,对于每个数字i
,检查total-i
是否在哈希表中。如果没有,则添加;如果是,那么你就有你的两个号码了。
不管是哪种方式,您都需要对数组进行额外的扫描以获得索引,但这没有问题--这只需要O(n)
时间。如果您想避免这种情况,可以根据需要将原始索引保留在排序列表或哈希表中,但这样会占用内存而不是时间占用。
假设我们重新定义剩余网络,不允许边进入。认为福特-富尔克森的程序仍然正确地计算了最大流量。 我在想,当我们增加一条路径时,反向边缘的剩余容量会增加,如果需要,可以用来减少该边缘的流量(但总体上增加网络流量)。因此,如果我们不允许边进入,这意味着我们不允许边中的流减少(是的相邻节点)。因此,当我们允许边进入时,我们可以有一个类似的循环 但是如果我们再次禁止边进入,我们可以在没有循环的情况下找到相同的
标准库的算法部分进行了如下改进:新增了一些算法函数;通过新语言特性改善了一些算法实现并且更易于使用。下面分别来看一些例子: 新算法: bool all_of(Iter first, Iter last, Pred pred); bool any_of(Iter first, Iter last, Pred pred); bool none_of(Iter first, Iter last, Pre
我试图找到一个简单问题的直接答案...在这里它是... 假设你有一个硬币更换算法,在面值为d(1)=1、d(2)=7和d(3)=10的系统中,n=10。 现在给出了教科书中算法的实现。。 结果会不会是:“使用10枚面额为1的硬币”? 这是因为当然,以我的理解,denom[1]=1,denom[2]=7,denom[3]=10。正确吗? 如果是这样的话,这个算法就不会被认为是最优的,对吗? 但是,代
如果使用双向链表代替数组,是否有可能提高插入排序算法的运行时间? 非常感谢。
我试着解决一个关于最大流量问题的问题。我有一个源和两个汇。我需要在这个网络中找到一个最大流量。这部分是一般最大流量。然而,在这种特殊的最大流问题中,两个目标必须得到相同的流量。 有没有人能帮助我,我该怎么做呢?
我有一个用于作业的递归排序算法,我的老师说有一个简单的方法可以提高我的算法的运行时间...但是我根本不知道它是什么。除非我错了,否则算法的复杂度是O(n)?我不确定,因为我们没有在课堂上学习如何计算递归方法的复杂度。代码如下: 我唯一能想到的是添加if(done)返回;在第一个循环之后,但它只会使程序免于执行其他一些操作。哦,交换方法基本上就是: 提前谢谢你。