当前位置: 首页 > article >正文

算法题目复习(0909-0917)

1. 连续子序列和

pdd的算法题,根本不记得怎么做

给一个数组,有正数和负数,算出连续子序列的和最大为多少

int maxSubArraySum(vector<int>& nums) {
    int maxSoFar = nums[0];
    int maxEndingHere = nums[0];

    for (size_t i = 1; i < nums.size(); ++i) {
        maxEndingHere = max(nums[i], maxEndingHere + nums[i]);
        maxSoFar = max(maxSoFar, maxEndingHere);
    }

    return maxSoFar;
}

int main() {
    std::vector<int> nums = {-2, 1, -3, 4, -1, 2, 1, -5, 4};
    int maxSum = maxSubArraySum(nums);
    std::cout << "Maximum subarray sum is " << maxSum << std::endl;
    return 0;
}

Kadane's算法

太神了。。主要灵魂是:要么继续当前子数组,要么从当前位置开始一个新的数组(就是说如果过去的数加上i<i,就没必要用过去的数了)

2. 给一个字符串,只包含A和B两种字符,判断这个数组包含AB数量相等的连续子序列最长是多少,应该怎么做用c++

用一个哈希表记录前缀和

主要我做的时候想到了前缀和,但是不知道怎么找一个数组两个相等的数之差最大是多少

它的算法就是用哈希表存下来(idx,val),如果下一个val在哈希表中存在,就更新idx之差最大。这样On就能算了。

3 最长上升子序列

没想到这题用动态规划都得n平方,好难

思路就是dp[i] 是以i结尾的,前面任意选的子序列,dp[j]是以j结尾的子序列,要从j转移到i,就意味着nums[i]肯定大于nums[j], 那就找比i小的所有j里,dp[j]最大的进行转移,+1

    int lengthOfLIS(vector<int>& nums) {
        int n = nums.size();
        vector<int> dp(n+1);
        dp[0] = 1;
        for(int i =1;i<n;i++){
            int maxj = 0;
            for(int j =0;j<i;j++){
                if(nums[j] < nums[i])
                    maxj = max(maxj, dp[j]);
            }
            dp[i] = maxj+1;
        }
        int res = 0;
        for(int i =0;i<n;i++){
            res = max(res, dp[i]);
        }
        return res;

4. 求质数

主要是求最小公约数,这个循环的话循环到sqrt(x)就行

或者先弄一个质数列表,这个列表得到的方式是:埃拉托斯特尼筛法

跟我想的差不多,用一个列表保存

还有!整除不要用/,用//

5. 搜索二维矩阵二

    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        int m = matrix.size(), n = matrix[0].size();
        int x = 0, y = n-1;
        while(x<m && y >= 0){
            if(matrix[x][y] == target){
                return true;
            }else if(matrix[x][y] > target){
                y --;
            }else{
                x++;
            }
        }
        return false;
    }

这题是z字形查找,就是从右上角的点开始查找,每次能排除一行或者一列

6. 图论的题

一直没搞清什么最短路那几个问题:

给一堆点,找到联通所有点的最短路

prim算法:找到n-1条边。每次选距离生成树最近的节点,将该点加入生成树,更新非生成树节点到生成树的距离。(初始化一个minDist数组,用来记录每个节点到生成树的最小距离)

初始化为每个点到第一个点的最小距离,然后迭代,它的重点在于选点,比较适合稠密图,复杂度是on平方

Krustral算法:是我自己想的那种并查集思路。对所有边按权值从大到小排列,判断选中的边的两个端点是否在一个并查集内,如果不在,就加入到一个。

djistra算法 

7. 随机链表的复制

就是给一个链表深拷贝为另一个链表,其中每个节点都有一个随机指针,指向任意一个节点

做法就是:定义两个old->new,new->old节点的映射map,第一次遍历创建新节点,并维护映射。第二次遍历根据老节点的random找到对应的新节点来设置新节点的random。

 Node* copyRandomList(Node* head) {
        unordered_map<Node*,Node*> mp;
        Node * head2 = new Node(0);
        Node * cur2 = head2;
        Node * cur = head;
        while(cur!=nullptr){
            cur2->next = new Node (cur->val);
            cur2 =cur2->next;
            mp[cur] = cur2;
            cur = cur->next;
        } 
        cur = head, cur2 = head2->next;
        while(cur!=nullptr){
            cur2->random = mp[cur->random];
            cur = cur->next;
            cur2 = cur2->next;
        }
        return head2->next;
    }


http://www.kler.cn/a/311028.html

相关文章:

  • Docker网络和overlay的基础讲解
  • Linux下MySQL的简单使用
  • AI赋能电商:创新应用提升销售与用户体验
  • 【时间之外】IT人求职和创业应知【34】-人和机器人,机器人更可靠
  • 【C++】详细介绍模版进阶,细节满满
  • 【缓存策略】你知道 Cache Aside(缓存旁路)这个缓存策略吗
  • Sqoop 数据迁移
  • git reflog
  • 机器学习:逻辑回归--过采样
  • 电巢科技携Ecosmos元宇宙产品亮相第25届中国光博会
  • Python实现 Socket.IO 的在线游戏场景
  • 51单片机-DS18B20(温度传感器)AT24C02(存储芯片) IIC通信-实验2-温度实时监测(可设置阈值)
  • 机器学习与深度学习之间的区别
  • 如何使用ORJSONResponse增强FastAPI应用性能:转换任意类型为JSON
  • Ubuntu 22.04上安装Python 3.10.x
  • Element走马灯组件循环播放两个页面是方向不一致
  • 网络安全实训九(域环境的创建及其信息收集)
  • 图像到图像的翻译
  • General OCR Theory: Towards OCR-2.0 via a Unified End-to-end Model
  • 用 ReactPHP 实现图片上传加速:让并发上传实现真正的高效
  • 软件测试工程师面试整理-操作系统与网络基础
  • 人工智能——猴子摘香蕉问题
  • centos中yum方式部署Jenkins
  • 【Linux取经之路】编译器gcc/g++的使用 调试器gdb的使用
  • OceanBase 运维管理工具 OCP 4.x 升级:聚焦高可用、易用性及可观测性
  • Vscode搭配latex简易教程