Leetcode - TwoSum
2016-03-28 13:43
323 查看
Question
Given an array of integers, return indices of the two numbers such that they add up to a specific target.You may assume that each input would have exactly one solution.
Example:
Given nums = [2, 7, 11, 15], target = 9,Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].
UPDATE (2016/2/13):
The return format had been changed to zero-based indices. Please read the above updated description carefully.public int[] twoSum(int[] nums, int target) { int[] numsNew = new int[nums.length]; System.arraycopy(nums, 0, numsNew, 0, nums.length); Arrays.sort(numsNew); int smallerCusor = 0; int largerCusor = numsNew.length - 1; // //去除数组中大于target的元素 // while(numsNew[largerCusor] > target) // largerCusor--; //从有序数组的两端往中间搜索 while (smallerCusor < largerCusor) { if (numsNew[smallerCusor] + numsNew[largerCusor] == target) break; else if (numsNew[smallerCusor] + numsNew[largerCusor] > target) largerCusor--; else smallerCusor++; } int s = 0; int l = numsNew.length -1; //分别从数组的两端开始搜索两个加数的下标 while(nums[s++] != numsNew[smallerCusor]); while(nums[l--] != numsNew[largerCusor]); return new int[]{s-1, l+1}; }
说明
由于Arrays.sort()对基本类型数据使用快速排序,对象数组使用归并排序,所以算法复杂度为O(nlogn);代码中注释掉的两行是因为nums数组中可能会有负数,所以不能预先排除掉一部分元素;
从数组的两端开始搜索下标的原因在于,这两个加数有可能相等。当然,也可以只从一端开始搜索,需要多写一些判断语句;
测试发现返回数组中两个下标的顺序没有要求;
本文解法的runtime位于所有AC的答案的89%,应该还有更好的解题思路,这里只是练习一下,就不去费脑找最优解了
相关文章推荐
- 关于指针的一些事情
- C# Pointer指针应用实例简述
- C++智能指针实例详解
- C++指向函数的指针实例解析
- 关于c语言指针的两处小tip分享
- 浅析iterator与指针的区别
- 探讨C++中数组名与指针的用法比较分析
- C++编程指向成员的指针以及this指针的基本使用指南
- 详解C++中的指针、数组指针与函数指针
- C++中字符串以及数组和指针的互相使用讲解
- C语言安全之数组长度与指针实例解析
- C++中指向对象的常指针与指向常对象的指针详解
- 指向变量的常指针与指向常变量的指针详细解析
- C#通过指针实现快速拷贝的方法
- php中将指针移动到数据集初始位置的实现代码[mysql_data_seek]
- C#通过指针读取文件的方法
- C语言指针学习经验总结浅谈
- C++交换指针实例
- C/C++中指针和引用之相关问题深入研究
- 讲解C语言编程中指针赋值的入门实例