剑指 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;
}
╰(*°▽°*)╯╰(*°▽°*)╯╰(*°▽°*)╯╰(*°▽°*)╯╰(*°▽°*)╯完╰(*°▽°*)╯╰(*°▽°*)╯╰(*°▽°*)╯╰(*°▽°*)╯╰(*°▽°*)╯