今天做了一道LeetCode上的题目—Two Sum,要求是求一个数组中是否有两个数的和是等于给定的值taget,如果有就返回这两个数的下标,没有返回【-1,-1】
思路
第一步:先判断输入的数组是否是null如果是空直接返回null;
第二部:先双重循环遍历数组,当找到两个数相同时就将这两个数的下标储存到数组中返回,没有返回【-1,-1】
代码如下
class Solution {
public int[] twoSum(int[] nums, int target) {
if(nums==null)
return null;
int i,j,result[]=new int[]{-1,-1};
for(i=0;i<nums.length;i++){
for(j=i+1;j<nums.length;j++){
if(nums[i]+nums[j]==target){
result[0]=i;
result[1]=j;
return result;
}
}
}
return result;
}
}
其实一开始我想的是另一个方法:先把该数组排序,然后再遍历,这样有个好处就是当遍历之后如果nums[i]+nums[i+1]>target的话,后面就不用遍历的,直接可以进入下一次的循环,但写完之后才发现你排完序之后下标就和原数组的不一样了,然后就用不了这个方法。。。。。。但这个方法不用来返回下标而是返回值的话还是可以用的
代码如下
class Solution {
public int[] twoSum(int[] nums, int target) {
if(nums==null)
return null;
int i,j,result[]=new int[]{-1,-1},temp[]=nums,t;
for(i=0;i<temp.length-1;i++){
for(j=0;j<temp.length-i-1;j++){
if(temp[j]>temp[j+1]){
t=temp[j+1];
temp[j+1]=temp[j];
temp[j]=t;
}
}
}
System.out.println(Arrays.toString(temp));
for(i=0;i<temp.length;i++){
for(j=i+1;j<temp.length;j++){
if(temp[i]+temp[j]==target){
result[0]=i;
result[1]=j;
return result;
}
if(temp[i]+temp[j]>target){
break;
}
}
}
return result;
}
}
class T
{
public static void main(String[] args)
{
long startTime = System.currentTimeMillis(); //获取开始时间
int []a=new int[]{20,19,18,17,16,15,14,12,13,11,10,8,5,7,4,2,1},result;
Solution s=new Solution();
result=s.twoSum(a,9);
System.out.println(Arrays.toString(result));
long endTime = System.currentTimeMillis(); //获取结束时间
System.out.println("程序运行时间:" + (endTime - startTime) + "ms"); //输出程序运行时间
}
}
粗心的地方:
1、第二种方法排序的时候交换两个元素的位置的时候居然只写了temp[i+1]=temp[i]而忘了写后面两步;
2、排序双重循环的时候第二重循环写了i++(应该写j++的)
还是要多做题。。。。。