给定一个无序数组和一个目标值,找出数组中两个数之和等于目标值的所有组合

题目:

给定一个无序数组和一个目标值,找出数组中两个数之和等于目标值的所有组合,并给出时间复杂度。

假设数组是[3,5,3,5],目标值是8。
答案是否可重复,题里没说,所以分3种情况,如下:

1.重复。答案是【0,1】【0,3】【1,2】【2,3】,序号组合,共4种组合。
解法如下:
1.1.嵌套遍历。时间复杂度:O(n^2)。
1.2.哈希法。键存数组元素值,值存出现次数。时间复杂度:O(n)。
1.3.排序+双指针夹逼。时间复杂度:O(nlogn)。

2.半重复。答案是【0,1】【2,3】,也可能是【0,3】【1,2】,序号组合,共2种组合。
解法如下:
2.1.嵌套遍历。时间复杂度:O(n^2)。
2.2.哈希法。键存数组元素值,值存出现次数。时间复杂度:O(n)。
2.3.排序+双指针夹逼。时间复杂度:O(nlogn)。

3.不重复。答案是[3,5],值组合,共1种组合。
解法如下:
3.1.嵌套遍历。时间复杂度:O(n^2)。
3.2.哈希法。键存数组元素值,值不存。时间复杂度:O(n)。
3.3.排序+双指针夹逼。时间复杂度:O(nlogn)。
3.4.位图法。时间复杂度:O(目标值)。

代码采用3.2方式,

用golang实现如下:

package main

import "fmt"

func main() {
    nums := []int{3, 5, 3, 5, 4, 4}
    target := 8
    for k, _ := range twoSum(nums, target) {
        fmt.Println(k, "+", target-k, "=", target)
    }
}

func twoSum(nums []int, target int) map[int]struct{} {
    map0 := make(map[int]struct{}) //缓存,哈希保存
    ret := make(map[int]struct{})  //保存结果

    for i := 0; i < len(nums); i++ {
        complement := target - nums[i]     //差值 = 目标值-元素值
        if _, ok := map0[complement]; ok { //如果字典里有差值,说明已经找到了
            if complement < nums[i] {
                ret[complement] = struct{}{}
            } else {
                ret[nums[i]] = struct{}{}
            }
        }
        //如果字典里没有差值,缓存数组的当前值
        map0[nums[i]] = struct{}{}
    }

    return ret
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是代码: ```c #include <stdio.h> // 寻找第一次或最后一次出现的索引号 int binarySearch(int arr[], int n, int target, int isFirst) { int left = 0, right = n - 1; int ans = -1; // 初始化为-1,表示没找到 while (left <= right) { int mid = left + (right - left) / 2; if (arr[mid] == target) { // 找到目标数 ans = mid; // 更新答案 if (isFirst) { // 如果是寻找第一次出现的 right = mid - 1; // 向左移动右边界 } else { // 如果是寻找最后一次出现的 left = mid + 1; // 向右移动左边界 } } else if (arr[mid] < target) { // 目标数在右半部分 left = mid + 1; } else { // 目标数在左半部分 right = mid - 1; } } return ans; } int main() { int arr[] = {1, 2, 2, 2, 4, 5, 5}; int n = sizeof(arr) / sizeof(arr[0]); int target = 2; // 要查找的目标数 int firstIndex = binarySearch(arr, n, target, 1); // 寻找第一次出现的索引号 int lastIndex = binarySearch(arr, n, target, 0); // 寻找最后一次出现的索引号 printf("第一次出现的索引号: %d\n", firstIndex); printf("最后一次出现的索引号: %d\n", lastIndex); return 0; } ``` 该代码中,`binarySearch` 函数使用二分查找法,在有序数组中寻找目标数第一次(或最后一次)出现的索引号。函数参数 `isFirst` 为布尔值,表示是否寻找第一次出现的索引号。如果该值为 `true`,则向左移动右边界,否则向右移动左边界。 在主函数中,我们先声明一个有序正整数数组 `arr` 和要查找的目标数 `target`,然后分别调用 `binarySearch` 函数,寻找第一次和最后一次出现的索引号,最后输出结果。 注意,该代码假设输入的数组已经有序。如果数组无序,需要先进行排序操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值