问题描述
给你一个下标从 0 开始的整数数组 nums
和一个整数 k
。
一次操作中,你可以删除 nums
中的最小元素。
你需要使数组中的所有元素都大于或等于 k
,请你返回需要的 最少 操作次数。
EX1.
EX2.
EX3.
代码实现
C语言I(老年痴呆复杂版/老实人板)
int minOperations(int* nums, int numsSize, int k)
{
int i,j;
int cnt=0;//定义计数器,表示操作次数
int min;//最小值
int min_index;//最小值下标
for(i=0;i<numsSize;i++)//外层循环:执行numsSize轮
{
min=nums[0];
min_index=0;
for(j=0;j<numsSize;j++)//内层循环:每次外层循环时,通过内层遍历找出一个最小值
{
if(nums[j]<min)
{
min=nums[j];
min_index=j;
}
}
if(min<k)//若该轮内层循环遍历找出的最小值小于k,
{
nums[min_index]=k;//那么赋新值为k,使其下一轮循环不会被找出
cnt++;//操作数加一
}
}
return cnt;//返回计数器=操作次数
}
C语言II(简单技巧版)
int minOperations(int* nums, int numsSize, int k)
{
int i;
int cnt=0;
for(i=0;i<numsSize;i++)//只需一层循环遍历数组,不用定义各种无用变量
{
if(nums[i]<k)
{
cnt++;//cnt表示数组中有多少小于k的元素
}
}
return cnt;//返回计数器=操作次数
}
总结
可能是对力扣的恐惧吧,加上之前看的题解都是几十上百行代码,总认为力扣的题目很难,我现在的刷题顺序其实是筛选:算法:通过率降序;目前是第三题。
初看的时候以为蛮难的,被示例输出误导了,因为每轮之后的数组大小都不一样,甚至还以为要用到动态数组规划、冒泡排序等等......后面发现想多了,用几个变量就行(甚至后面发现练几个变量都不用,一轮循环遍历就行),上面的C语言I是我自己想的,感觉还是有了做题思维了......有时候思维没有跳转,对于输出和输入和实现过程的关系没有把握清楚。
这道题的实现还是很简单的,所以给我的启示就是,还是得对于想思路的时间和代码时间还是要好好权衡......好的思路可以大大减少代码时间,但光思考不开始写也没办法想出更好的思路,我觉得这一点应该无论在学校还是以后去企业都很重要。
(btw:期中考试终于结束了!可以好好码代码(掉头发bushi)了)