剑指 Offer 40. 最小的k个数 剑指 Offer 42. 连续子数组的最大和

剑指 Offer 40. 最小的k个数                                                    

输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。

示例 1:

输入:arr = [3,2,1], k = 2
输出:[1,2] 或者 [2,1]
示例 2:

输入:arr = [0,1,2,1], k = 1
输出:[0]

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/zui-xiao-de-kge-shu-lcof

这个没什么好说的,我的思路就是排下序,这样小的就在前面了,还有下面那句一定不能忘

 

 

 

int cmp(void* s1, void* s2)
 {
     return *(int*)s1 - *(int*)s2;
 }
int* getLeastNumbers(int* arr, int arrSize, int k, int* returnSize)
{
    *returnSize = k;//不能忘
    int* p = (int*)malloc(k * sizeof(int));//放输出数组
    qsort(arr, arrSize, sizeof(arr[0]), cmp);
    int i = 0;
    for(i = 0; i < k; i++)
    {
        p[i] = arr[i];
    }
    return p;
    free(p);
    p = NULL;
}

 

剑指 Offer 42. 连续子数组的最大和

 

输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。

要求时间复杂度为O(n)。

示例1:

输入: nums = [-2,1,-3,4,-1,2,1,-5,4]
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。

 

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/lian-xu-zi-shu-zu-de-zui-da-he-lcof

这个比上面的难(个人感觉)

下面我解释一下

我创建了两个变量retmax(最后返回的值), initsum(用来存放数组和)

本题是要求 所有子数组的和的最大值,所以我们先让initsum = nums[0]; 

,进入循环,i = 1,我们从第二位开始,initsum和nums[i] 相加 如果结果小于num[i] ,

那initsum是个负数,我们要抛弃他, 往下来( 注意我们求的是连续子数组 ),

initsum = nums[i];,如果不是就相加,注意这里initsum变了,不是nums[i]了,是和了

是这个和下一位加,再判断

如果,retmax 小于 initsum ,那就retmax = initsum,不大就不换,那之后有负数加上来,也不怕,因为retmax 会大于initsum,最后返回 retmax

int maxSubArray(int* nums, int numsSize)
{
    int retmax = nums[0];
    int initsum = nums[0];
    int i = 0;
    for(i = 1; i < numsSize; i++)
    {
        if((initsum + nums[i]) < nums[i])
        {
            initsum = nums[i];
        }
        else
        {
           initsum += nums[i]; 
        }
        if(retmax < initsum)
        {
            retmax = initsum;
        }
    }
    return retmax;
}

╰(*°▽°*)╯╰(*°▽°*)╯╰(*°▽°*)╯╰(*°▽°*)╯╰(*°▽°*)╯完╰(*°▽°*)╯╰(*°▽°*)╯╰(*°▽°*)╯╰(*°▽°*)╯╰(*°▽°*)╯

你可能感兴趣的:(力扣刷题---,(c语言解题),算法,数据结构,c语言,leetcode)