说明
此题相对简单,所以代码在课程视频中。当时忘记收集亲密度的代码了,以后一定注意。
最大亲密度
有若干包饼干,每包饼干的数量记录在数组nums中,比如:{4,1,7,5} ,分配给若干(如:3)小朋友。
每种分配方案的亲密度:任意两个小朋友饼干数的差的绝对值的最小值。
求所有分配方案中的最大亲密度。
分配方案{1,7,5}的亲密度=min(7-1,5-1,7-5}=2
分配方案{4,7,5}的亲密度=min(7-4,5-4,7-5}=1
分配方案{4,1,5}的亲密度=min(4-1,5-4,5-1}=1
分配方案{4,1,7}的亲密度=min(4-1,7-4,7-1)=3
解决思路
先按升序排序。
完成函数is,判断是否存在方案能够满足亲密只大于等于iQinMi。
因为要找最大值,所以中值符合的时候,抛弃左边。中值跟随右边,用左开右闭。
完全 平方数(PerfectSquare)
判断正整数y是否是完全 平方数。如果能找到正整数x,使得x*x==y,则y是平方数。
思路
条件 |
处理 |
x*x>y |
丢弃右半部分 |
x*x==y |
y是完全 平方数 |
x*x<y |
丢弃左半部分 |
x的取值范围是[1,y],我们用左闭右开空间,就是[1,y+1)。
注意:计算过程要注意溢出。
扩展:如果y是自然数呢?y可以为0。
排列箱子
有n个箱子,求可以排列多少行(包括不完整行)。第一行1个箱子,第二行2个箱子...第i行i个箱子。注意:最后一行可能没满,除最后一行外其他行全满。
解题思路
m行排满,共有maxN= m*(1+m)/2个箱子。
m行只排一个,共有minN = maxN-m+1个箱子。
如果n小于minN,则抛弃右边;
如果n大于maxN,则抛弃左边。
边界[1,n],左闭右开空间是[1,n+1)
扩展
如果求完整的行,最后一行如果没满,则忽略。
解法一:
则判断m对应的maxN是不是等于n。如果是,返回m;不是,返回m-1。
解法二:
如果maxN 小于等于n,则返回ture,如果有多个,则返回索引最大的一个。
条件 |
处理 |
maxN < n |
抛弃左边 |
maxN ==n |
抛弃左边 |
maxN > n |
抛弃右边 |
用左闭右开区间。[1,n+1)
第一步代码
// PerfectSquare.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // #include <iostream> #include <vector> bool IsPerfectSquare(int y ) { } int main() { std::vector<int> v; for (int i = 1; i < 1000; i++) { if (IsPerfectSquare(i)) { v.emplace_back(i); } } for (const auto& n : v) { std::cout << n << " "; } }
第二步代码
#include <iostream> #include <vector> bool IsPerfectSquare(int y ) { int left = 1, right = y + 1; while (right - left > 1) { int x = left + (right - left) / 2; if (x * x == y) { return true; } else if (x * x > y) { right = x; } else { left = x; } } return left * left == y; } int main() { std::vector<int> v; for (int i = 1; i < 1000; i++) { if (IsPerfectSquare(i)) { v.emplace_back(i); } } for (const auto& n : v) { std::cout << n << " "; } }
其它
视频课程
如果你觉得复杂,想从简单的算法开始,可以学习我的视频课程。
https://edu.csdn.net/course/detail/38771
我的其它课程
https://edu.csdn.net/lecturer/6176
测试环境
win7 VS2019 C++17 或Win10 VS2022 Ck++17
相关下载
算法精讲《闻缺陷则喜算法册》doc版