C++二分算法习题:判断是否是完全平方数[容易]和排列箱子[容易]

简介: C++二分算法习题:判断是否是完全平方数[容易]和排列箱子[容易]

说明

此题相对简单,所以代码在课程视频中。当时忘记收集亲密度的代码了,以后一定注意。

最大亲密度

有若干包饼干,每包饼干的数量记录在数组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版

https://download.csdn.net/download/he_zhidan/88348653

相关文章
|
1月前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之顺序表习题精讲【无论是王道考研人还真爱粉都能包会的;不然别给我家鸽鸽丢脸好嘛?】
顺序表的定义和基本操作之插入;删除;按值查找;按位查找习题精讲等具体详解步骤以及举例说明
|
2月前
|
存储 算法 C++
高精度算法(加、减、乘、除,使用c++实现)
高精度算法(加、减、乘、除,使用c++实现)
685 0
高精度算法(加、减、乘、除,使用c++实现)
|
2月前
|
算法 数据处理 C++
c++ STL划分算法;partition()、partition_copy()、stable_partition()、partition_point()详解
这些算法是C++ STL中处理和组织数据的强大工具,能够高效地实现复杂的数据处理逻辑。理解它们的差异和应用场景,将有助于编写更加高效和清晰的C++代码。
47 0
|
2月前
|
存储 算法 决策智能
【算法】博弈论(C/C++)
【算法】博弈论(C/C++)
|
2月前
|
存储 算法 C++
【算法】哈希映射(C/C++)
【算法】哈希映射(C/C++)
|
2月前
|
机器学习/深度学习 人工智能 算法
【算法】最长公共子序列(C/C++)
【算法】最长公共子序列(C/C++)
|
2月前
|
人工智能 算法 BI
一篇带你速通差分算法(C/C++)
一篇带你速通差分算法(C/C++)
|
2月前
|
人工智能 算法 C++
一篇带你速通前缀和算法(C/C++)
一篇带你速通前缀和算法(C/C++)
|
2月前
|
存储 算法 C++
弗洛伊德(Floyd)算法(C/C++)
弗洛伊德(Floyd)算法(C/C++)
|
2月前
|
存储 算法 程序员
迪杰斯特拉(Dijkstra)算法(C/C++)
迪杰斯特拉(Dijkstra)算法(C/C++)