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");
}