秋招突击——7/2——复习{}——新作{分割等和子集、不同路径、最小路径和、最长回文子串}

文章目录

    • 引言
    • 复习
    • 新作
      • 分割等和子集
        • 个人实现
        • 参考实现
      • 不同路径
        • 个人实现
        • 参考实现
      • 最小路径和
        • 个人实现
        • 参考实现
      • 最长回文子串
        • 个人实现
        • 参考实现
          • 字符串哈希+二分
    • 总结

引言

  • 今天起的挺早的,早上把昨天录得关于JVM的相关八股都听完了,然后还背了一部分八股,洗了衣服,差不多十点钟开始刷算法题,还是有点慢的,不够快。
  • 剩下的时间加把劲,加油!!

复习

新作

分割等和子集

题目链接

在这里插入图片描述
注意

  • 只包含正整数
  • 非空
  • 分割成两个相等的子集
个人实现
  • 首先,这不是一个连续的子集,所以不能使用单调队列或者区间DP,并没有任何意义,只能从实际的角度出发,按照集合的角度出发,去判断
  • 这是一个子集的问题,所以每一个元素要么是放或者不放,究竟该如何使用集合的角度去考虑?
  • 这里想不到什么别的方法,如果使用既然要保证相等,我就可以对nums进行排序,然后的使用两个单向队列进行实现,保证结果相同,如果两个指针相遇了,还不行,就是找不到。
class Solution {
public:
    bool canPartition(vector<int>& nums) {
        if(nums.size() == 1)    return false;
        sort(nums.begin(),nums.end());
        int l = 0,r = nums.size() - 1;
        int lsum = nums[l],rsum = nums[r];
        while(l + 1 < r){
            if(lsum < rsum ){
                l ++;
                lsum += nums[l];
            }else if(lsum > rsum){
                r--;
                rsum += nums[r];
            }else{
                // 如果是双边合拢的,已经相等了,就直接返回
                // if(l + 1 == r)  return true;
                l ++;
                r --;
                lsum += nums[l];
                rsum += nums[r];

            }
        }
        cout<<"l: "<<l<<"r: "<<r<<endl;
        
        // 判定最终的结果
        if(lsum == rsum && l + 1 == r )   return true;
        else return false;
        
    }
};

在这里插入图片描述
总结

  • 思路有问题,明显没有考虑到对应的顺序不同的情况
参考实现
  • 经典的零一背包问题,每一个物体的体积是每一个数字的值,然后价值为0,背包的容量应该是二分之和

属是没有考虑到,既然两个子集的和是相等的,那么加起来就是二分之一

sum是奇数的话,一定是无解的,因为没有办法进行有效平均

有一个很大的bug,完全没想到,就是已经求出来了所有元素的和,然后只要求出另外一半的和的构成,那么原来的数组减去这一半数组也就是综合的一半了吗?

完全没有想到!!!

在这里插入图片描述

  • 搞明白上述的等式关系之后,就可以将其完全转换为对应的零一背包问题,f[i]表示当前容量i下,能不能第i个物体,刚好满足容量i。
    • 就需要判定上一个f[i - x] 其中x是当前物体的容量,和那个值相与就行了。

在这里插入图片描述

根据思路提示写的代码

class Solution {
public:
    bool canPartition(vector<int>& nums) {
        // 判定当前的容器的个数
        if(nums.size() == 1)    return false;
        
        // 计算对应的累加和
        int s = 0;
        for(auto i : nums)  s += i;
        if(s % 2 != 0)  return false;

        // 声明一个状态矩阵
        int m = s / 2;
        vector<int> f(m + 1,0);
        f[0] = 1;
        for(auto a:nums){
            for(int i = m;i >= a;i --){
                f[i] |= f[i - a];
            }
        }
        return f[m];

    }
};

注意,使用了滚动数组优化之后,第二个数组要逆序遍历

不同路径

题目链接

在这里插入图片描述
在这里插入图片描述

注意

  • 机器人只能向下或者向右移动
  • 目标和起点是一致的,然后只能向下和向右移动,说明只能走特定的步数m + n - 1;
个人实现
  • 这就是一个数字三角形的问题,做过了很多,但是这里找不到了。

最低通行费

  • 其他的我知道我做过的,也写过分析,但是找不到了,不过不重要,知道怎么做就行了。
  • f[i][j]表示从起点到达第i,j格总共的路径数量,因为只有两种方向,所以是
    • f[i][j] = f[i - 1][j] + f[i][j - 1]

在这里插入图片描述

  • 同时对于总共的路径也有了限制为m + n - 1,具体实现如下
class Solution {
public:
    int uniquePaths(int m, int n) {
        typedef long long LL;
        int step = m + n - 2;
        vector<vector<LL>> f(m + 1,vector<LL>(n + 1,0));
        f[0][0] = 1;
        for(int i = 1;i <= step;i ++){
            for(int row = 0;row < m && row <= i;row ++){
                int col = i - row;
                if(col <= n){
                    // 如果是第一列,就只能来自上面
                    if(row >= 1)    f[row][col] += f[row - 1][col];
                    // 如果是第一行,只能来自左边
                    if(col >= 1) f[row][col] += f[row ][col - 1];
                    // cout<<f[row][col]<<endl;
                }
            }
        }
        return f[m - 1][n - 1];
    }
};

实现效果
在这里插入图片描述
总结

  • 代码框架是一个没记住,这是自己推出来的,然后之前写的东西找不到了。不过得好好去看看代码。
参考实现
  • 和我的思路是一样,但是我这里明显整的有点复杂,他写的就很简单,很多东西都没有必要,具体实现步骤如下。
  • 就是遍历所有的格子,按照行号和列号进行遍历就行了,然后使用状态转移方程,具体如下
class Solution {
public:
    int uniquePaths(int m, int n) {
        typedef long long LL;
        vector<vector<LL>> f(m + 1,vector<LL>(n + 1,0));
        f[0][0] = 1;
        for(int r = 0;r < m;r ++){
            for(int c = 0; c < n; c++){
                if(r) f[r][c] += f[r- 1][c];
                if(c) f[r][c] += f[r][c - 1];
            }
        }
        return f[m - 1][n - 1];
    }
};

在这里插入图片描述

最小路径和

题目链接

在这里插入图片描述
注意

  • 只能向右或者向下移动
  • 路径上的总和最小
  • f[i][j] = min(f[i - 1][j], f[i][j - 1]) + w[i][j]
个人实现
  • 这道题就是爽题,和上面那道题基本上一模一样,只不多是状态转移方程变了而已,需要加上当前走这一步的路径。
class Solution {
public:
    int minPathSum(vector<vector<int>>& grid) {
        int m = grid.size(),n = grid[0].size();
        vector<vector<int>> f(m + 1,vector<int>(n + 1,INT_MAX));
        f[0][0] = grid[0][0];
        for(int r = 0;r < m;r ++){
            for(int c = 0;c < n;c ++){
                if(r) f[r][c] = min( f[r][c], f[r - 1][c]+ grid[r][c]) ;
                if(c) f[r][c] = min( f[r][c], f[r][c -1]+ grid[r][c]) ;
            }
        }
        return f[m - 1][n - 1];
    }
};

在这里插入图片描述
实现起来,基本上和之前的代码差不多

参考实现
class Solution {
public:
    int minPathSum(vector<vector<int>>& grid) {
        int n = grid.size();
        if (!n) return 0;
        int m = grid[0].size();

        vector<vector<int>> f(n, vector<int>(m, INT_MAX));
        for (int i = 0; i < n; i ++ )
            for (int j = 0; j < m; j ++ ) {
                if (!i && !j) f[i][j] = grid[i][j];
                else {
                    if (i) f[i][j] = min(f[i][j], f[i - 1][j] + grid[i][j]);
                    if (j) f[i][j] = min(f[i][j], f[i][j - 1] + grid[i][j]);
                }
            }

        return f[n - 1][m - 1];
    }
};

作者:yxc
链接:https://www.acwing.com/activity/content/code/content/363553/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

总结

  • 基本上思路都是一样的,不过他判定了是否存在第一个元素的情况,这里我缺失了

最长回文子串

题目链接

在这里插入图片描述
注意

  • 最长回文字符串,字符串可为单数也可以为奇数
个人实现
  • 这道题之前实现过,自己做的时候,做出来过,具体链接如下
    • 上一次做的链接
  • 这里自己思考一下,怎么实现

枚举中心点,分奇数和偶数进行讨论

  • 将每一个索引的字符串作为中心点,然后往两边进行进行便利,如果不行,直接退出。
class Solution {
public:
    string longestPalindrome(string s) {
        string res = "";
        for(int i = 0;i < s.size();i ++){
            // 奇数模式,两边相同,往两边进行遍历
            int l = i,r = i;
            while(l >= 0 && r < s.size() && s[l] == s[r]) l--,r++;
            if(r - l - 1 > res.size())    res = s.substr(l + 1,r - l  -1);

            // 偶数模式
            l = i ,r = i + 1;
            while(l >= 0 && r < s.size() && s[l] == s[r]) l --,r ++;
            if(r - l - 1 > res.size())    res = s.substr(l + 1,r - l  -1);
        }
        return res;
    }
};

总结

  • 这个写的比第一次要好很多,对比着看一下
参考实现
字符串哈希+二分
  • 时间不够了,这里贴一下人家的代码和思路吧,还有论文要写,不能花太多时间。
    在这里插入图片描述
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
using namespace std;
typedef unsigned long long ULL;
const int N = 2e6 + 10 , base = 131;
ULL hr[N] , hl[N] , p[N];
char str[N];
ULL get(ULL h[] , int l , int r)
{
    return h[r] - h[l - 1] * p[r + 1 - l];
}
int main()
{
    int T = 1;
    while(cin >> str + 1 , strcmp(str + 1 , "END"))
    {
        int n = strlen(str + 1), res = 0;
        for(int i = 2 * n ; i >= 0 ; i -= 2)
        {
            str[i] = str[i / 2];
            str[i - 1] = 'z' + 1;
        }
        n *= 2; p[0] = 1;
        for(int i = 1 , j = n; i <= n ; i ++ , j -- )
        {
            p[i] = p[i - 1] * base;
            hl[i] = hl[i - 1] * base + str[i];
            hr[i] = hr[i - 1] * base + str[j];
        }

        for(int i = 1 ; i <= n ; i ++ )
        {
            int l = 0 , r = min(n - i , i - 1);
            while(l < r)
            {
                int mid = l + r + 1 >> 1;
                if(get(hl, i - mid, i - 1) == get(hr, n + 1 - (i + mid), n + 1 - (i + 1)))l = mid;
                else r = mid - 1;
            }
            if(str[i - l] <= 'z')res = max(res , l + 1);
            else res = max(res , l);
        }
        printf("Case %d: %d\n",T ++ , res);
    }
    return 0;
}

作者:tom233
链接:https://www.acwing.com/solution/content/33154/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

此情此景,多么相似,又是没有时间,笑死了

总结

  • 目前来看,总是在最后快结束的时候,才把这些题目昨晚,总是会出点问题,很难受。对于函数的越界考虑的不够充分,最后的异常根据他给的条件又不好找。然后还有一个问题就是,最后的输出总是会输出,不要总是关注于平时的过程,还要关注于最终的输出。
  • 一个上午,基本上就背了八股,然后做了两道题目,还是不够,有点欠缺,得继续加油加油,进度太慢了!明天腾讯复试,能不能进都无所谓了,现在好好准备秋招吧。马上提前批就开始了。
  • 今天基本上关于迷宫路径的题目都做完了,整体看起来还不错,挺顺利的
  • 今天到此为止吧,累了,明天还得早起背书,准备腾讯的面试,虽然我觉得进的概率不大,而且大概率是KPI,无所谓了,接收一下打击也不错!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/767428.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

用Chromatix进行tuning流程

##一、基本调试 ###1、工程初始配置&#xff1a; 这个工具就是一个图形化的参数编辑器&#xff0c;其实所有tuning中的效果参数直接改文件参数酒醒&#xff0c;工具的好处是&#xff1a;带有检查错误和模拟的功能以及一些校验工具和脚本。 初始化可以中需要的配置&#xff1a;t…

基于Java的音乐网站系统01239

目 录 摘要 1 绪论 1.1 研究背景 1.2系统开发目标、意义 1.3研究内容 2 相关技术介绍 2.1 MySQL数据库 2.2 Java编程语言 2.3 SpringBoot框架介绍 3 系统需求分析与设计 3.1 可行性分析 3.1.1 技术可行性分析 3.1.2 经济可行性分析 3.1.3 法律可行性分析 3.2 需…

IP地址定位中多源数据融合的应用

IP地址定位如今在诸如网络安全、地理信息服务、智能交通等领域发挥着关键作用。然而&#xff0c;传统的基于单一数据源&#xff08;如IP数据库&#xff09;的定位方法往往存在精度有限、可靠性不足等问题。多源数据融合技术的出现为解决这些问题提供了新的思路和方法。今天我们…

【机器学习】在【Pycharm】中的实践教程:使用【逻辑回归模型】进行【乳腺癌检测】

目录 案例背景 具体问题 1. 环境准备 小李的理解 知识点 2. 数据准备 2.1 导入必要的库和数据集 小李的理解 知识点 2.2 数据集基本信息 小李的理解 知识点 注意事项 3. 数据预处理 3.1 划分训练集和测试集 小李的理解 知识点 注意事项 3.2 数据标准化 小李…

北京app开发与小程序开发相比较下的优势

随着互联网科技与移动技术的不断成熟&#xff0c;app与小程序的使用也越来越频繁。作为现如今人们日常生活中不可或缺的辅助工具&#xff0c;各企业也开始探索、开发自己的小程序或app。那么&#xff0c;这两者的区别是什么呢&#xff1f;两者相比&#xff0c;北京app开发又具有…

Android平台崩溃和 ANR 问题进行符号化解析、解析崩溃日志的内存地址

使用Android Logcat Stacktrace Utility | Android Logcat | 1.2.3 1.设置so库路径 2.打开Stacktrace Utility工具 3.在Original粘贴报错内存地址 4.点击Resolve Stacktraces,就会解析出内存地址 如果是红色,解析失败了,缺少原生so库,可以在第一步添加so库文件再次尝试…

未公开 GeoServer开源服务器wfs远程命令执行漏洞 已复现(CVE-2024-36401)

0x01 阅读须知 技术文章仅供参考&#xff0c;此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等&#xff08;包括但不限于&#xff09;进行检测或维护参考&#xff0c;未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成…

【进阶篇】Java 项目中对使用递归的理解分享

前言 笔者在最近的项目开发中&#xff0c;遇到了两个父子关系紧密相关的场景&#xff1a;评论树结构、部门树结构。具体的需求如&#xff1a;找出某条评论下的所有子评论id集合&#xff0c;找出某个部门下所有的子部门id集合。 在之前的项目开发经验中&#xff0c;递归使用得是…

win10下Python的安装和卸载

前言 之前电脑上安装了python3.9版本&#xff0c;因为工作需要使用3.6版本的Python&#xff0c;需要将3.9版本卸载&#xff0c;重新安装3.6版本。下面就是具体的操作步骤: 1. 卸载 在我的电脑中搜索到3.9版本的安装文件&#xff0c;如下图&#xff1a; 双击该应用程序&#xf…

数据结构历年考研真题对应知识点(树的基本概念)

目录 5.1树的基本概念 5.1.2基本术语 【森林中树的数量、边数和结点数的关系&#xff08;2016&#xff09;】 5.1.3树的性质 【树中结点数和度数的关系的应用&#xff08;2010、2016&#xff09;】 【指定结点数的三叉树的最小高度分析&#xff08;2022&#xff09;】 5.1…

win10显示毫秒-上午-下午及星期几,24小时制

关于毫秒 winr regedit 计算机\HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced 新建ShowSecondsInSystemClock&#xff0c;编辑1显示&#xff0c;不显示就删了它 然后重启 资源管理器可能有多个全部重启&#xff0c;就可以啦 根据自己喜好…

【MySQL】表的操作{创建/查看/修改/删除}

文章目录 1.创建表1.1comment&#xff1a;注释信息1.2存储引擎 2.查看表3.修改表3.1add添加列&#xff0c;对原数据无影响3.2drop删除列3.3modify修改列类型3.4change修改列名3.5rename [to]修改表名 4.删除表5.总结 1.创建表 CREATE TABLE table_name (field1 datatype,field…

昇思MindSpore学习笔记3-02热门LLM及其他AI应用--K近邻算法实现红酒聚类

摘要&#xff1a; 介绍了K近邻算法&#xff0c;记录了MindSporeAI框架使用部分wine数据集进行KNN实验的步聚和方法。包括环境准备、下载红酒数据集、加载数据和预处理、搭建模型、进行预测等。 一、KNN概念 1. K近邻算法K-Nearest-Neighbor(KNN) 用于分类和回归的非参数统计…

2024年下半年系统集成项目管理工程师使用新版教材,该如何备考?

2024年下半年&#xff0c;新版的《系统集成项目管理工程师教程》&#xff08;第3版&#xff09;将被系统集成项目管理工程师使用。许多考生可能会感到迷茫&#xff0c;不知道该如何复习。毕竟教材更新后&#xff0c;以往的资料和真题都变得无用&#xff0c;重点内容和考试方向也…

llm学习-3(向量数据库的使用)

1&#xff1a;数据读取和加载 接着上面的常规操作 加载环境变量---》获取所有路径---》加载文档---》切分文档 代码如下&#xff1a; import os from dotenv import load_dotenv, find_dotenvload_dotenv(find_dotenv()) # 获取folder_path下所有文件路径&#xff0c;储存在…

OV SSL证书年度成本概览:为企业安全护航的经济之选

在当今数字化时代&#xff0c;企业网站不仅是品牌展示的窗口&#xff0c;更是与客户沟通的桥梁。然而&#xff0c;随着网络威胁的不断升级&#xff0c;保护网站安全成为了企业不可忽视的任务。SSL证书&#xff0c;特别是OV SSL证书&#xff0c;因其对企业身份的严格验证&#x…

Halcon OCR字符识别(极坐标转换,字符识别)

Halcon OCR字符识别&#xff08;极坐标转换&#xff0c;字符识别&#xff09; 代码 * 1.加载图片 *************************************************** dev_close_window () read_image (Image, ./img) get_image_size (Image, Width, Height) dev_get_window (WindowHandle…

聚鼎贸易:装饰画开店教程新手入门

当艺术遇上商业&#xff0c;每一幕交易皆是文化的交流。本篇将引领有志于开设装饰画店铺的新手们&#xff0c;迈入创业的门槛&#xff0c;以独特的视角和步骤&#xff0c;探索如何成功经营一家装饰画店。 精选货源乃基石。货源的选取不仅反映店主的品味&#xff0c;更直接影响到…

NPDP|产品经理的沟通协调能力:塑造产品成功的核心力量

在快速发展的商业环境中&#xff0c;产品经理的角色愈发重要。他们不仅要负责产品的战略规划、需求管理、项目管理&#xff0c;更要与团队内外各方进行有效的沟通协调。那么&#xff0c;产品经理的沟通协调能力到底有多重要呢&#xff1f;本文将深入探讨这一话题。 沟通是产品成…

使用css做一个旋转的八卦图

使用css做一个旋转的八卦图 1, html部分 <div class"tai"><div class"bai"></div><div class"hei"></div> </div>2, css部分 .tai{width: 200px;height: 200px;border: 1px solid #000;background: linea…