【力扣C语言】每日一题—第121题,买卖股票的最佳时机

题目:

返回获取的最大利润:

这题可浪费时间了!!!

主要是暴力求解超时!!!

最后参考了一下答案

解题思路:

思路一:

暴力求解:两重for循环判断最大利润(超时)

VS代码:

#include <stdio.h>
​
​
int main(int argc, char const *argv[])
{
    int prices[]={7,6,4,3,1};
    int pricesSize=5;
    int prices_max=prices[1]-prices[0];
    for(int i=0;i<pricesSize;i++)
    {
        for(int j=0;j<i;j++)
        {
            if((prices[i]-prices[j])>prices_max)
            {
                prices_max=prices[i]-prices[j];
            }
        }
    }
    if(prices_max<0)
    {
       // return 0;
       prices_max=0;
    }
    //return prices_max;
    printf("%d\n",prices_max);
    return 0;
}
​

思路二:

1、定义最小值为999999(定大一点,小了在范围内会出现不跳转的情况导致出错,比十的四次方大就可以)定义最大值为0;

2、i从0到pricesSize(有效数字个数);

3、判断最大值与利润(当前遍历值-最小值)的大小,利润大于最大值,将利润赋值给最大值。

4、判断最小值与当前值的大小,最小遍历值小于当前值,将当前遍历值赋给最小值。

5、返回最大值。

Vs代码:

#include <stdio.h>
​
​
int main(int argc, char const *argv[])
{
    int prices[]={7,1,5,3,6,4};
    int pricesSize=6;
    int prices_max=0;
    int prices_min=9999;
    for(int i=0;i<pricesSize;i++)
    {
        prices_max=prices_max<(prices[i]-prices_min)?(prices[i]-prices_min):prices_max;
        prices_min=prices_min>prices[i]?prices[i]:prices_min;
    }
    printf("%d\n",prices_max);
    return 0;
}

最终通过代码:

int maxProfit(int* prices, int pricesSize) {
    int prices_min=10001,prices_max=0;
    for(int i=0;i<pricesSize;i++)
    {
        prices_max=prices_max<(prices[i]-prices_min)?(prices[i]-prices_min):prices_max;
        prices_min=prices_min>prices[i]?prices[i]:prices_min;
    }
    return prices_max;
}

再接再励吧!!!!!!!

脑袋空空。

如果有更好的方案,请赐教,感谢!

<think>好的,我现在需要帮用户找到力扣一题的C语言解决方案。用户之前已经讨论过Python的两种方法,现在转向C语言。首先,我得回忆一下力扣一题的要求:给定一个整数数组和一个目标值,找出数组中和为目标值的两个数的下标,并且每个输入只对应一个答案,不能重复使用元素。 用户提供的引用中有几个C语言的例子,比如引用[1]和引用[2]都是暴力解法的实现,而引用[3]是双指针方法,但可能用于有序数组的情况。需要确认用户的问是否需要考虑不同的解法,比如暴力法或哈希表,但C语言中没有内置的哈希表结构,可能需要自己实现,或者用户希望更简单的解决方案。 用户之前的回答中提到了暴力解法和哈希表优化,但在C语言中哈希表实现比较复杂,尤其是对于刚学C的用户来说可能比较困难。所以可能用户更倾向于暴力解法,这也是力扣官方解中常见的方法,尤其是对于第一题来说,通常暴力法更容易理解。 接下来需要检查用户提供的引用中的代码是否正确。引用[1]和引用[2]中的代码都是双重循环,符合暴力解法的思路。需要注意内存分配和返回值的处理,比如使用malloc分配内存,并设置returnSize。引用[3]中的双指针方法可能适用于有序数组,但原中的数组是无序的,所以直接使用双指针可能无法得到正确结果,除非先排序,但这会改变下标,所以可能不适用。 用户可能希望得到一个正确的C语言暴力解法,同时需要处理内存分配和返回参数。需要注意在C语言中,函数需要返回指针,并且调用者负责释放内存,这符合力扣目要求。此外,需要处理找不到解的情况,返回NULL,并设置returnSize为0。 可能还需要对比用户提供的引用中的代码,看看是否有错误。例如,引用[3]中的函数返回类型是int,但目要求返回int指针,所以这可能是一个错误,用户需要注意。因此,在回答中需要指出正确的实现方式,避免用户被错误的代码误导。 最后,用户可能需要一个清晰的步骤解释,说明代码的结构和关键点,比如双重循环遍历所有元素对,检查它们的和是否等于目标值,以及内存分配和错误处理的部分。同时,相关问可以引导用户进一步思考优化方法或处理不同情况,比如数组有序时的双指针方法,或者如何处理重复元素。</think>### 分步解答:力扣一题(两数之和)C语言实现 #### 方法一:暴力解法(双重循环) 通过嵌套循环遍历所有元素组合,时间复杂度$O(n^2)$,空间复杂度$O(1)$,适用于小规模数据[^1][^2]。 ```c #include <stdio.h> #include <stdlib.h> int* twoSum(int* nums, int numsSize, int target, int* returnSize) { for (int i = 0; i < numsSize; ++i) { for (int j = i + 1; j < numsSize; ++j) { if (nums[i] + nums[j] == target) { int* result = (int*)malloc(2 * sizeof(int)); if (result == NULL) { *returnSize = 0; return NULL; } result[0] = i; result[1] = j; *returnSize = 2; return result; } } } *returnSize = 0; return NULL; } ``` #### 关键点说明 1. **内存管理**:使用`malloc`动态分配返回数组,调用者需手动`free`释放内存[^1][^2] 2. **参数规范**:遵循力扣接口要求,通过`returnSize`返回结果数组长度 3. **去重机制**:内层循环从`i+1`开始,避免重复使用同一元素 4. **错误处理**:内存分配失败时返回`NULL`并设置`returnSize=0` #### 测试示例 ```c int main() { int nums[] = {2, 7, 11, 15}; int target = 9; int returnSize; int* result = twoSum(nums, 4, target, &returnSize); if (returnSize == 2) { printf("下标: [%d, %d]\n", result[0], result[1]); free(result); } else { printf("未找到解\n"); } return 0; } ``` #### 进阶思路 对于有序数组可优化为双指针法(时间复杂度$O(n)$),但原数组无序,需注意排序会改变原始下标[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值