美文网首页
LeetCode第一题

LeetCode第一题

作者: Rumbles | 来源:发表于2019-04-23 07:36 被阅读0次

    给定一个整数数组 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");
    }
    

    相关文章

      网友评论

          本文标题:LeetCode第一题

          本文链接:https://www.haomeiwen.com/subject/orshyqtx.html