【算法集训 | 暑期刷题营】8.8题---计算几何

简介: 【算法集训 | 暑期刷题营】8.8题---计算几何

👉引言


铭记于心
🎉✨🎉我唯一知道的,便是我一无所知🎉✨🎉


💖 ❄️我们的算法之路❄️💖


   众所周知,作为一名合格的程序员,算法 能力 是不可获缺的,并且在算法学习的过程中我们总是能感受到算法的✨魅力✨。

☀️🌟短短几行代码,凝聚无数前人智慧;一个普通循环,即是解题之眼🌟☀️

💝二分,💝贪心,💝并查集,💝二叉树,💝图论,💝深度优先搜索(dfs) ,💝宽度优先搜索(bfs) ,💝数论,💝动态规划等等, 路漫漫其修远兮,吾将上下而求索! 希望在此集训中与大家共同进步,有所收获!!!🎉🎉🎉

image.png


今日主题:几何


作为计算机科学的一个分支,计算几何主要研究解决几何问题的算法。在现代工程和数学领域,计算几何在图形学、机器人技术、超大规模集成电路设计和统计等诸多领域有着十分重要的应用。本文将举出三道面试题来体验一下计算几何在算法中的应用


 👉⭐️第一题💎


   ✨题目


     883. 三维形体投影面积

image.png


   ✨思路:


今天的题是计算几何,竞赛中会出现的题型,一般都会难一点,第一道还算可以,ans = 每一行的最大值之和 + 每一列的最大值之和 + 不为0的点数量,知道这个核心点其余代码就是coding问题了


   ✨代码:


class Solution:
    def projectionArea(self, grid: List[List[int]]) -> int:
        n = len(grid)
        x = sum([max(row) for row in grid])
        y = sum([max([grid[i][j] for i in range(n)]) for j in range(n)])
        z = sum([sum([1 if grid[i][j] != 0 else 0 for i in range(n)]) for j in range(n)])
        return x + y + z


 👉⭐️第二题💎


   ✨题目


     2280. 表示一个折线图的最少线段数 - 力扣(LeetCode)

image.png


   ✨思路:


由于题目中给出了日期与价格的变化趋势,分析可知,按day排序stockPrices后计算每两个点的斜率,斜率变化表示不在同一条直线,根据这一点就可以得出最少的线段数,也就是去掉在同一条直线上的无效点


   ✨代码:


class Solution {
private:
  int getLen(vector<int>& p1, vector<int>& p2)
  {
      return pow(p2[0]-p1[0], 2) + pow(p2[1]-p1[1],2);
  }
public:
    bool validSquare(vector<int>& p1, vector<int>& p2, vector<int>& p3, vector<int>& p4) {
           vector<int> lens;
           lens.resize(6, 0);
           lens[0] = getLen(p1, p2);
           lens[1] = getLen(p1, p3);
           lens[2] = getLen(p1, p4);
           lens[3] = getLen(p2, p4);
           lens[4] = getLen(p2, p3);
           lens[5] = getLen(p3, p4);
           for(int i = 0; i < 6; i++)
           {
               if(lens[i] == 0){
                   return false;
               }
           }
           std::sort(lens.begin(), lens.end());
           if(lens[0] == lens[1] && lens[1] == lens[2] && lens[2] == lens[3] && lens[4] == lens[5] && lens[0]*2 == lens[5])
           {
               return true;
           }
           return false;
    }
};


 👉⭐️第三题💎


   ✨题目


     593. 有效的正方形 - 力扣(LeetCode)

image.png


   ✨思路:


通过题目容易得出正方形的属性如下:四个边相等,对角线相等。先说明它是平行四边形;再说明它是菱形(或矩形);最后说明它是矩形(或菱形),然后判定是否对角线,可以考虑用unordered_set基于哈希表的判重,相比于set基于红黑树的判重性能上会快很多,也可以定义数组去标记,空间换时间,但是数据量太大的时候就不建议这么做。


   ✨代码:


class Solution {
private:
  int getLen(vector<int>& p1, vector<int>& p2)
  {
      return pow(p2[0]-p1[0], 2) + pow(p2[1]-p1[1],2);
  }
public:
    bool validSquare(vector<int>& p1, vector<int>& p2, vector<int>& p3, vector<int>& p4) {
           vector<int> lens;
           lens.resize(6, 0);
           lens[0] = getLen(p1, p2);
           lens[1] = getLen(p1, p3);
           lens[2] = getLen(p1, p4);
           lens[3] = getLen(p2, p4);
           lens[4] = getLen(p2, p3);
           lens[5] = getLen(p3, p4);
           for(int i = 0; i < 6; i++)
           {
               if(lens[i] == 0){
                   return false;
               }
           }
           std::sort(lens.begin(), lens.end());
           if(lens[0] == lens[1] && lens[1] == lens[2] && lens[2] == lens[3] && lens[4] == lens[5] && lens[0]*2 == lens[5])
           {
               return true;
           }
           return false;
    }
};

🌹写在最后💖

相信大家对今天的集训内容的理解与以往已经有很大不同了吧,或许也感受到了算法的魅力,当然这是一定的,路漫漫其修远兮,吾将上下而求索!伙伴们,明天见!🌹🌹🌹

相关文章
|
5天前
|
存储 算法 C语言
【数据结构与算法 刷题系列】合并两个有序链表
【数据结构与算法 刷题系列】合并两个有序链表
|
16天前
|
算法 C++
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题-2
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题
|
5天前
|
算法
【数据结构与算法 刷题系列】求带环链表的入环节点(图文详解)
【数据结构与算法 刷题系列】求带环链表的入环节点(图文详解)
|
5天前
|
算法
【数据结构与算法 刷题系列】判断链表是否有环(图文详解)
【数据结构与算法 刷题系列】判断链表是否有环(图文详解)
|
5天前
|
算法
【数据结构与算法 刷题系列】移除链表元素
【数据结构与算法 刷题系列】移除链表元素
|
5天前
|
存储 算法 C语言
【数据结构与算法 刷题系列】环形链表的约瑟夫问题
【数据结构与算法 刷题系列】环形链表的约瑟夫问题
|
5天前
|
算法 C语言
【数据结构与算法 刷题系列】求链表的中间结点
【数据结构与算法 刷题系列】求链表的中间结点
|
5天前
|
机器学习/深度学习 自然语言处理 算法
m基于深度学习的OFDM+QPSK链路信道估计和均衡算法误码率matlab仿真,对比LS,MMSE及LMMSE传统算法
**摘要:** 升级版MATLAB仿真对比了深度学习与LS、MMSE、LMMSE的OFDM信道估计算法,新增自动样本生成、复杂度分析及抗频偏性能评估。深度学习在无线通信中,尤其在OFDM的信道估计问题上展现潜力,解决了传统方法的局限。程序涉及信道估计器设计,深度学习模型通过学习导频信息估计信道响应,适应频域变化。核心代码展示了信号处理流程,包括编码、调制、信道模拟、降噪、信道估计和解调。
26 8
|
7天前
|
算法
基于GA遗传优化的混合发电系统优化配置算法matlab仿真
**摘要:** 该研究利用遗传算法(GA)对混合发电系统进行优化配置,旨在最小化风能、太阳能及电池储能的成本并提升系统性能。MATLAB 2022a用于实现这一算法。仿真结果展示了一系列图表,包括总成本随代数变化、最佳适应度随代数变化,以及不同数据的分布情况,如负荷、风速、太阳辐射、弃电、缺电和电池状态等。此外,代码示例展示了如何运用GA求解,并绘制了发电单元的功率输出和年变化。该系统原理基于GA的自然选择和遗传原理,通过染色体编码、初始种群生成、适应度函数、选择、交叉和变异操作来寻找最优容量配置,以平衡成本、效率和可靠性。
|
8天前
|
机器学习/深度学习 算法
基于鲸鱼优化的knn分类特征选择算法matlab仿真
**基于WOA的KNN特征选择算法摘要** 该研究提出了一种融合鲸鱼优化算法(WOA)与K近邻(KNN)分类器的特征选择方法,旨在提升KNN的分类精度。在MATLAB2022a中实现,WOA负责优化特征子集,通过模拟鲸鱼捕食行为的螺旋式和包围策略搜索最佳特征。KNN则用于评估特征子集的性能。算法流程包括WOA参数初始化、特征二进制编码、适应度函数定义(以分类准确率为基准)、WOA迭代搜索及最优解输出。该方法有效地结合了启发式搜索与机器学习,优化特征选择,提高分类性能。