leetcode 1300.转变数组后最接近目标值的数组和(sum of mutated array closest to target)C语言

leetcode 1300.转变数组后最接近目标值的数组和(sum of mutated array closest to target)C语言

1.description

https://leetcode-cn.com/problems/sum-of-mutated-array-closest-to-target/description/

给你一个整数数组 arr 和一个目标值 target ,请你返回一个整数 value ,使得将数组中所有大于 value 的值变成 value
后,数组的和最接近 target (最接近表示两者之差的绝对值最小)。

如果有多种使得和最接近 target 的方案,请你返回这些整数中的最小值。

请注意,答案不一定是 arr 中的数字。

示例 1:

输入:arr = [4,9,3], target = 10
输出:3
解释:当选择 value 为 3 时,数组会变成 [3, 3, 3],和为 9 ,这是最接近 target 的方案。

示例 2:

输入:arr = [2,3,5], target = 10
输出:5

示例 3:

输入:arr = [60864,25176,27249,21296,20204], target = 56803
输出:11361

提示:

1 <= arr.length <= 10^4
1 <= arr[i], target <= 10^5

2.solution

涉及二分的题基本做完了,有点恍惚,总觉得这种解法会在某些情况漏掉正确的解,提交后15个case也都通过了,自己也试了一些case好像也没错,先这样吧,如果出错了之后回来再改。更好的思路在 这里,自己为何没想到啊

int findBestValue(int* arr, int arrSize, int target){
    int max_ele = INT_MIN;
    for(int i=0; i<arrSize; ++i){
        if(arr[i]>max_ele) max_ele = arr[i];
    }

    int low = 0, high = max_ele;
    int e = INT_MAX, res = max_ele; // e表示sum和target差值
    
    while(low <= high){
        int mid = low + (high - low) / 2;
        int sum = 0;
        for(int i=0; i<arrSize; ++i){
            sum += arr[i]>mid ? mid : arr[i];
        }
        if(sum == target){
            res = mid;
            break;
        }else if(sum < target){
            low = mid + 1;
            if(target-sum < e){
                e = target-sum;
                res = mid;
                continue;
            }
            if(target-sum == e && mid < res){
                res = mid;
            }
        }else{
            high = mid - 1;
            if(sum-target < e){
                e = sum-target;
                res = mid;
                continue;
            }
            if(target-sum == e && mid < res){
                res = mid;
            }
        }
    }

    return res;
}
给定一个整数数组 nums 和一个目标值 target,要求在数组中找出两个数的和等于目标值,并返回这两个数的索引。 思路1:暴力法 最简单的思路是使用两层循环遍历数组的所有组合,判断两个数的和是否等于目标值。如果等于目标值,则返回这两个数的索引。 此方法的时间复杂度为O(n^2),空间复杂度为O(1)。 思路2:哈希表 为了优化时间复杂度,可以使用哈希表来存储数组中的元素和对应的索引。遍历数组,对于每个元素nums[i],我们可以通过计算target - nums[i]的值,查找哈希表中是否存在这个差值。 如果存在,则说明找到了两个数的和等于目标值,返回它们的索引。如果不存在,将当前元素nums[i]和它的索引存入哈希表中。 此方法的时间复杂度为O(n),空间复杂度为O(n)。 思路3:双指针 如果数组已经排序,可以使用双指针的方法来求解。假设数组从小到大排序,定义左指针left指向数组的第一个元素,右指针right指向数组的最后一个元素。 如果当前两个指针指向的数的和等于目标值,则返回它们的索引。如果和小于目标值,则将左指针右移一位,使得和增大;如果和大于目标值,则将右指针左移一位,使得和减小。 继续移动指针,直到找到两个数的和等于目标值或者左指针超过了右指针。 此方法的时间复杂度为O(nlogn),空间复杂度为O(1)。 以上三种方法都可以解决问题,选择合适的方法取决于具体的应用场景和要求。如果数组规模较小并且不需要考虑额外的空间使用,则暴力法是最简单的方法。如果数组较大或者需要优化时间复杂度,则哈希表或双指针方法更合适。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值