问题
numstarget

你可以假设每种输出只会对应一个答案。但是,数组中同一个元素不能使用两边。

示例:

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

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

解答

C语言

暴力方法,内外循环

#include <stdio.h>

int *findTwoNums(int *nums, int size, int target) {
    int i, j;
    int *ret = NULL;
    for(i=0;i<size;i++) {
        for(j=i+1;j<size;j++){
            if(target == nums[i] + nums[j]) {
                ret =(int *)malloc(sizeof(int) * 2);
                ret[0] = i;
                ret[1] = j;
                return ret;
            }
        }
    }
    return ret;
}

int main(void) {
    int a[] = {2, 7, 11,15};
    int b = 4;
    int c = 9;
    
    int *out = findTwoNums(a, b, c);

    printf("1=%d,2=%d\n", out[0], out[1]);
    return 0;
}

golang

暴力方法,内外循环

package main

import (
    "fmt"
)

func main() {
    var ff = [] int {1, 3, 5, 7, 9}
    target := 16 
    out := findTwoNums(ff, target)
    fmt.Printf("it is %d and %d \n", out[0], out[1])
}

func findTwoNums(nums [] int, target int) [2] int {
    for i := 0; i < len(nums); i++ {
        for j := i+1; j < len(nums); j++ {
            if nums[i] + nums[j] == target {
                return [2] int {i, j}
            }
        }
        
    }
    return [2] int {}
}

利用map,将nums的下标和值分别作为value和key存储到map中。在遍历中寻找map中是否有target-value的key

package main

import (
    "fmt"
)

func main() {
    var ff = [] int {1, 3, 5, 7, 9}
    target := 16
    out := findTwoNums(ff, target)
    fmt.Printf("it is %d and %d \n", out[0], out[1])
}

func findTwoNums(nums [] int, target int) [2] int {
    m := map[int]int{}
    for i, v := range nums {    //i为下标,v为值
        if k, ok := m[target - v]; ok {
            return [2]int{k, i}
        }
        m[v] = i //map下标为nums的值,存储的值为nums的下标
    }
    return [2]int{}
}