题目描述:
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
示例:
输入:nums=[2,7,11,15],target=9
返回:[0,1]
暴力法1:C
相当朴实无华纯属暴力解答,就是从第一个开始遍历找。
时间复杂度:O(n^2)
/*
* Note: The returned array must be malloced, assume caller calls free().
*/
int* twoSum(int* nums, int numsSize, int target, int* returnSize){
//暴力解法
int i,j;
int *returns=(int *)malloc(sizeof(int)*2);
for(i=0;i<numsSize-1;i++)
{
for(j=i+1;j<numsSize;j++)
{
if(nums[i]+nums[j]==target)
{
returns[0]=i;
returns[1]=j;
*returnSize=2;
return returns;
}
}
}
return returns;
}
提交结果:
暴力法2:Java
依然是朴实无华暴力解法,从头遍历。换个语言看看效果好了。
时间复杂度:O(n^2)
class Solution {
public int[] twoSum(int[] nums, int target) {
//暴力法
int[] res=new int[2]; //返回下标数组
for(int i=0;i<nums.length-1;i++)
{
for(int j=i+1;j<nums.length;j++)
{
if(nums[i]+nums[j]==target)
{
res[0]=i;
res[1]=j;
return res;
}
}
}
return res;
}
}
运行效果:
哇哦…Java的内存消耗。
暴力法3:C#
时间复杂度:O(n^2)
public class Solution {
public int[] TwoSum(int[] nums, int target) {
for(int i=0;i<nums.Length-1;i++)
{
for(int j=i+1;j<nums.Length;j++)
{
if(nums[i]+nums[j]==target)
{
return new int[]{i,j};
}
}
}
return new int[]{0,0};
}
}
中间报错一次,没有IDE的提示就很容易写错。
数组长度属性Length,L大写!L大写!L大写!
运行结果: