在1数组中,找到二数和为 X 的最有效率算法
在一数组中,找到二数和为 X 的最有效率算法
大牛们好,我在练习 leetcode,遇到它一题(https://leetcode.com/problems/two-sum/)是写说
输入:参数为一数组及二数之和
输出:二数的 index数组,二数均大於零,且小的在前面
目前我的代码如下,复雜度是 n^2 而出现了 Time Limit Exceeded 的不合格提示,想请问高手这该怎麽写比较好…
------解决思路----------------------
如果数组不是按照大小顺序排列的,那你这种做法没有什么问题,但是如果是排序的,则你的做法就是有问题的。
如果是排序的的话,则可以这样循环,外层循环所有,内层通过二分的办法查找,则复杂度是n*logn,比你这个性能好多了。
------解决思路----------------------
输入数组有序?O(nlgn)可以实现。先进行进行预处理,把大于x的数排除掉;然后,每次取一个数,总共执行n趟,用该数与x做差,二分查找,O(lgn)。二分查找时,左边界是当前数的下一个数值,这里可以节省运算。
如果无序,先排序,可以O(nlgn)完成,其他同有序。两次O(nlgn)从量级上会优于O(n^2)
大牛们好,我在练习 leetcode,遇到它一题(https://leetcode.com/problems/two-sum/)是写说
输入:参数为一数组及二数之和
输出:二数的 index数组,二数均大於零,且小的在前面
目前我的代码如下,复雜度是 n^2 而出现了 Time Limit Exceeded 的不合格提示,想请问高手这该怎麽写比较好…
public class Solution {
public int[] twoSum(int[] numbers, int target) {
int[] result= null;
for(int i=0;i<numbers.length;i++){
int num1 = numbers[i];
for(int j=1; j<numbers.length; j++){
int num2 = numbers[j];
int sum = num1+num2;
if(sum == target){
if(num2 >= num1){
return result = new int[] {i, j};
} else {
return result = new int[] {j, i};
}
}
}
}
return null;
}
}
------解决思路----------------------
如果数组不是按照大小顺序排列的,那你这种做法没有什么问题,但是如果是排序的,则你的做法就是有问题的。
如果是排序的的话,则可以这样循环,外层循环所有,内层通过二分的办法查找,则复杂度是n*logn,比你这个性能好多了。
------解决思路----------------------
输入数组有序?O(nlgn)可以实现。先进行进行预处理,把大于x的数排除掉;然后,每次取一个数,总共执行n趟,用该数与x做差,二分查找,O(lgn)。二分查找时,左边界是当前数的下一个数值,这里可以节省运算。
如果无序,先排序,可以O(nlgn)完成,其他同有序。两次O(nlgn)从量级上会优于O(n^2)