LeetCode第一题

2019-04-23  本文已影响0人  Rumbles

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。

你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。

示例:

给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

#import <Foundation/Foundation.h>

int* twoSum(int* nums, int numsSize, int target);
int* twoSum1(int* nums, int numsSize, int target);
int* twoSum2(int* nums, int numsSize, int target);
int* twoSum3(int* nums, int numsSize, int target);
int main(int argc, const char * argv[]) {

    ///> 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
    ///> 你可以假设每种输入 只会对应一个答案。但是,你不能重复利用这个数组中同样的元素
    
    ///> 给定 nums = [2, 7, 11, 15], target = 9
    ///> 因为 nums[0] + nums[1] = 2 + 7 = 9
    ///> 所以返回 [0, 1]
    
    int nums[] = {16,10,11,15,2,7};
    
//    int *result = twoSum(nums,6,9);
//    printf("twoSum 第一个是:%d,第二个是:%d \n",*result,*(result + 1));


    
    int *result3 = twoSum3(nums,6,9);
    printf("twoSum3 第一个是:%d,第二个是:%d \n",*result3,*(result3 + 1));
    
//    int *result2 = twoSum2(nums,6,9);
//    printf("twoSum2 第一个是:%d,第二个是:%d \n",*result2,*(result2 + 1));
//
//    int *result1 = twoSum1(nums,6,9);
//    printf("twoSum1 第一个是:%d,第二个是:%d \n",*result1,*(result1 + 1));
    
    return 0;
}

///> C 语言不允许返回一个完整的数组作为函数的参数   所以我们返回的是数组的指针  返回一个int型的数组指针  注意  twoSum是地址。*twoSum是值
///> 有且只有一个答案

#pragma mark - 执行的时间空间都比较大   主要解决C语言无法返回数组
int* twoSum(int* nums, int numsSize, int target) {
    static int arr[2];
    for (int a = 0; a < numsSize; a++) {
        for (int b = 0; b < numsSize; b++) {
            if (a != b && (*(nums + a) + *(nums + b)) == target) {
                arr[0] = a;
                arr[1] = b;
                return arr;
            }
        }
    }
    return nil;
}


int* twoSum1(int* nums, int numsSize, int target) {
    for (int a = 0; a < numsSize; a++) {
        for (int b = 0; b < numsSize; b++) {
            if (a != b && (*(nums + a) + *(nums + b)) == target) {
                *nums = a;
                *(nums + 1) = b;
                return nums;
            }
        }
    }
    return nums;
}


int* twoSum2(int* nums, int numsSize, int target) {
    
    int *arr;
    arr = (int *)malloc(8);
    
    for (int a = 0; a < numsSize; a++) {
        for (int b = 0; b < numsSize; b++) {
            if (a != b && (*(nums + a) + *(nums + b)) == target) {
                *arr = a;
                *(arr + 1) = b;
                return arr;
            }
        }
    }
    return arr;
}


int* twoSum3(int* nums, int numsSize, int target) {
    
    static int arr3[2]={0};
    
    for (int a = 0; a < numsSize - 1; a++) {
        for (int b = a + 1; b < numsSize; b++) {
            if (nums[a] + nums[b] == target) {
                arr3[0] = a;
                arr3[1] = b;
                return arr3;
            }
        }
    }
    return 0;
}

使用hash表解决会更加简单

public int[] twoSum(int[] nums, int target) {
    Map<Integer, Integer> map = new HashMap<>();
    for (int i = 0; i < nums.length; i++) {
        map.put(nums[i], i);
    }
    for (int i = 0; i < nums.length; i++) {
        int complement = target - nums[i];
        if (map.containsKey(complement) && map.get(complement) != i) {
            return new int[] { i, map.get(complement) };
        }
    }
    throw new IllegalArgumentException("No two sum solution");
}
上一篇下一篇

猜你喜欢

热点阅读