算法刷题记录-其他类型(LeetCode)

news2024/12/26 11:58:07

57 57. Insert Interval

思路 模拟

用指针去扫 intervals,最多可能有三个阶段:

  1. 不重叠的绿区间,在蓝区间的左边
  2. 有重叠的绿区间
  3. 不重叠的绿区间,在蓝区间的右边

逐个分析
不重叠,需满足:绿区间的右端,位于蓝区间的左端的左边,如 [1,2]。

则当前绿区间,推入 ans数组,指针 +1,考察下一个绿区间。
循环结束时,当前绿区间的屁股,就没落在蓝区间之前,有重叠了,如 [3,5]。
现在看重叠的。我们反过来想,没重叠,就要满足:绿区间的左端,落在蓝区间的屁股的后面,反之就有重叠:绿区间的左端 <= 蓝区间的右端,极端的例子就是 [8,10]。

和蓝有重叠的区间,会合并成一个区间:左端取蓝绿左端的较小者,右端取蓝绿右端的较大者,不断更新给蓝区间。
循环结束时,将蓝区间(它是合并后的新区间)推入 ans 数组。
剩下的,都在蓝区间右边,不重叠。不用额外判断,依次推入 ans 数组。

代码

class Solution {
public:
    vector<vector<int>> insert(vector<vector<int>>& intervals, vector<int>& newInterval) {
        vector<vector<int>> ans;
        int i=0;
        for (; i < intervals.size(); ++i) {
            if (intervals[i][1]<newInterval[0]){
                ans.push_back(intervals[i]);
            }
            else{
                break;
            }
        }
        int i_begin=i;
        int end=newInterval[1];
        if (i_begin>=intervals.size()){
            intervals.push_back(newInterval);
            return intervals;
        }
        int begin=min(intervals[i_begin][0],newInterval[0]);
        while (i<intervals.size()&&intervals[i][1]<=newInterval[1]){
            i++;
        }
        if (i>=intervals.size()){
            ans.push_back({begin,newInterval[1]});
            return ans;
        }
        if (intervals[i][0]<=newInterval[1])
        {
            end=intervals[i][1];
            i++;
        }
        ans.push_back({begin,end});
        for (; i < intervals.size(); ++i) {
            ans.push_back(intervals[i]);
        }
        return ans;
    }
};

764. Largest Plus Sign

思路

对数据进行缓存,缓存每一个坐标的当前列·行的长度信息至max_length_columnmax_length_row。若对目标矩阵的每一个元素进行遍历,若缓存不存在则建立缓存,若缓存存在则直接返回缓存结果。最终的十字大小为min(列,行)

代码

class Solution {
    private int n;
    private int[][] mines_arr;
    private int[][] max_length_column;
    private int[][] max_length_row;

    public int orderOfLargestPlusSign(int _n, int[][] mines) {
        n = _n;
        mines_arr = new int[n][n];
        max_length_column = new int[n][n];
        max_length_row = new int[n][n];

        if (n * n == mines.length) {
            return 0;
        }

        for (int[] vec : mines) {
            mines_arr[vec[0]][vec[1]] = 1;
        }

        int curr_ans = 1;
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < n; ++j) {
                if (mines_arr[i][j] == 1) {
                    continue;
                }

                int column_length = max_length_column[i][j];
                if (column_length == 0) {
                    updateColumn(i, j);
                    column_length = max_length_column[i][j];
                }

                int row_length = max_length_row[i][j];
                if (row_length == 0) {
                    updateRow(i, j);
                    row_length = max_length_row[i][j];
                }

                curr_ans = Math.max(Math.min(column_length, row_length), curr_ans);

                if (curr_ans == 3) {
                    int a = 3;
                }
            }
        }
        return curr_ans;
    }
        private void updateColumn(int r, int c) {
        int r_org = r;
        int curr = 1;
        while (r < n && mines_arr[r][c] != 1) {
            r++;
        }
        r--;
        for (int i = r_org; i <= r; i++, r--) {
            max_length_column[i][c] = curr;
            max_length_column[r][c] = curr;
            curr++;
        }
    }

    private void updateRow(int r, int c) {
        int column_org = c;
        int curr = 1;
        while (c < n && mines_arr[r][c] != 1) {
            c++;
        }
        c--;
        for (int i = column_org; i <= c; i++, c--) {
            max_length_row[r][i] = curr;
            max_length_row[r][c] = curr;
            curr++;
        }
    }
}

766. Toeplitz Matrix

思路

模拟题,按照顺序遍历即可

代码

    bool isToeplitzMatrix(vector<vector<int>> &matrix) {
        int column_length=matrix[0].size();
        int row_length=matrix.size();
        int r = 0;
        int c = 0;
        while (c < column_length) {
            int first_element=matrix[0][c];
            for (int i = 1; i < min(column_length-c,row_length); ++i) {
                if (matrix[i][c+i]!=first_element){
                    return false;
                }
            }
            c++;
        }
        while (r < row_length) {
            int first_element=matrix[r][0];
            for (int i = 1; i < min(row_length-r,column_length); ++i) {
                if (matrix[r+i][i]!=first_element){
                    return false;
                }
            }
            r++;
        }
        return true;
    }

796. Rotate String

思路(相对顺序不变)

首先应考虑原字符串和目标字符串长度相同。
考虑旋转后相对顺序不变的特点,在字符串后添加一个相同的原字符串,直接在修改后的字符串寻找是否存在目标字串即可。

    bool rotateString(string _s, string goal) {
        if (_s.length()!=goal.length()){
            return false;
        }
        string s = _s + _s;
        if (s.find(goal) != string::npos) {
            return true;
        }
        return false;
    }

816. Ambiguous Coordinates

思路 模拟

从坐标1开始尝试对每一个位置进行左右切分,并确认切分后的字串有多少种合法形式,然后令左右字串的合法形式做叉集即可。

代码

class Solution {
    List<String> ans=new ArrayList<>();
    public List<String> ambiguousCoordinates(String s) {
        s=s.substring(1,s.length()-1);
        for (int i=1;i<s.length();i++){
            combineResults(s,i);
        }
        return ans;
    }
    public void combineResults(String str,int idx){
        String[] x_axis=getValidateStrs(str.substring(0,idx));
        String[] y_axis=getValidateStrs(str.substring(idx));
        for (var x:x_axis){
            for (var y:y_axis){
                ans.add("("+x+", "+y+")");
            }
        }
    }
    public String[] getValidateStrs(String str){
        ArrayList<String> res=new ArrayList<>();
        char[] ch_list=str.toCharArray();
        for (int i=1;i<ch_list.length;i++){
            String integer_part=String.valueOf(ch_list,0,i);
            if (integer_part.matches("^0.+")){
                continue;
            }
            String decimal_part= str.substring(i);
            if (decimal_part.endsWith("0")){
                continue;
            };
            res.add(integer_part+"."+decimal_part);
        }
        if (!str.matches("^0.+")){
            res.add(str);
        }
        return res.toArray(new String[0]);
    }

}

937. Reorder Data in Log Files

思路 模拟

按照题目要求,首先对数字类和字母类的log进行分类,数组类的直接并入ArrayList、字母类的宪先并入,最后按照要求排序即可。要注意的是,处理字母类时最好存储为ArrayList<String[]> 方便排序。

代码

class Solution {
    public String[] reorderLogFiles(String[] logs) {
        ArrayList<String[]>alphaSet=new ArrayList<>();
        ArrayList<String>numSet=new ArrayList<>();
        for (String log:logs){
            if (judgeNum(log)){
                numSet.add(log);
                continue;
            }
            alphaSet.add(log.split(" "));
            alphaSet.sort((o1,o2)->{
                int curr=1;
                for (; curr < Math.min(o1.length,o2.length); curr++) {
                    int cmp=o1[curr].compareTo(o2[curr]);
                    if (cmp!=0){
                        return cmp;
                    }
                }
                if (o1.length==o2.length){
                    return o1[0].compareTo(o2[0]);
                }
                if (o1.length<o2.length){
                    return -1;
                }
                return 1;
            });
        }
        String[] ans=new String[logs.length];
        ArrayList<String> res= alphaSet.stream().map(obj->
            String.join(" ",obj)
        ).collect(Collectors.toCollection(ArrayList::new));
        for (int i = 0; i < res.size(); i++) {
            ans[i]=res.get(i);
        }
        for (int i = 0; i < numSet.size(); i++) {
            ans[i+res.size()]=numSet.get(i);
        }
        return ans;
    }
    boolean judgeNum(String string){
        var list=string.split(" ",2);
        return Character.isDigit(list[1].charAt(0));
    }
}

1267. Count Servers that Communicate

思路

统计每一行列计算机的数量,然后再对grid的每一个元素进行遍历,若grid[i][j]为计算机且其所在行列数量大于1则结果+1;

代码

    public int countServers(int[][] grid) {
        int[] rowServers=new int[grid.length];
        int[] columnServers=new int[grid[0].length];
        int ans=0;
        for (int i = 0; i < rowServers.length; i++) {
            int rowSum=0;
            for (int j = 0; j < columnServers.length; j++) {
                rowSum+=grid[i][j];
            }
            rowServers[i]=rowSum;
        }
        for (int j = 0; j < columnServers.length; j++) {
            int columnSum=0;
            for (int i = 0; i <rowServers.length ; i++) {
                columnSum+=grid[i][j];
            }
            columnServers[j]=columnSum;
        }
        for (int i = 0; i < grid.length; i++) {
            for (int j = 0; j <grid[0].length ; j++) {
                if (grid[i][j]==1&&(rowServers[i]>1||columnServers[j]>1)){
                    ans++;
                }
            }
        }
        return ans;
    }

1921. Eliminate Maximum Number of Monsters

思路 模拟

使用 d i s t i / s p e e d i dist_i/speed_i disti/speedi即可求出每个怪物的到达时间 t i m e i time_i timei。对time进行排序。只要任意时刻来的怪兽数量大于时间即返回结果,若没有则说明可以全部消灭。

代码

    public int eliminateMaximum(int[] dist, int[] speed) {
        double[] time=new double[dist.length];
        for (int i = 0; i < dist.length; i++) {
            time[i]=(double) dist[i]/speed[i];
        }
        Arrays.sort(time);
        for (int i=0;i<dist.length;i++){
            if (time[i]-i<=EPSILON){
                return i;
            }
        }
        return dist.length;
    }

2240. Number of Ways to Buy Pens and Pencils

思路 模拟

对于每一个可能的cost1商品的数量(total-cnt_1*cost1>=0),计算cost2的商品一共有几种可能方案,求和即可。

代码

    public long waysToBuyPensPencils(int total, int cost1, int cost2) {
        long ans=0;
        long cnt_1=0;
        while (total-cnt_1*cost1>=0){
            long residual=total-cnt_1*cost1;
            ans+=residual/cost2+1;
            cnt_1++;
        }
        return ans;
    }

2840. Check if Strings Can be Made Equal With Operations II

思路

题目提到:

可以对两个字符串中的 任意一个 执行以下操作 任意 次:
选择两个下标 i 和 j ,满足 i < j 且 j - i 是 偶数,然后 交换 这个字符串中两个下标对应的字符。

也就是说 奇数位置和奇数位置之间的字符的位置可以任意互换,偶数位置和偶数位置之间的字符可以任意互换,因为他们满足j-i是偶数这一条件。因此,直接分别统计技术位和偶数位的各个字符的出现次数并比较两字符串的出现次数是否相同即可。

代码

class Solution {
    public boolean checkStrings(String s1, String s2) {
        int[] singleCnt=new int[26];
        int[] evenCnt=new int[26];
        for (int i=0;i<s1.length();i+=2){
            singleCnt[s1.charAt(i)-'a']++;
        }
        for (int i=1;i<s1.length();i+=2){
            evenCnt[s1.charAt(i)-'a']++;
        }
        for (int i=0;i<s2.length();i+=2){
            singleCnt[s2.charAt(i)-'a']--;
            if (singleCnt[s2.charAt(i)-'a']<0){
                return false;
            }
        }
        for (int i=1;i<s2.length();i+=2){
            evenCnt[s2.charAt(i)-'a']--;
            if (evenCnt[s2.charAt(i)-'a']<0){
                return false;
            }
        }
        return true;
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第 2 章 线性表 ( 双链循环线性表(链式存储结构)实现)

1. 背景说明 2. 示例代码 1) status.h /* DataStructure 预定义常量和类型头文件 */#ifndef STATUS_H #define STATUS_H#define CHECK_NULL(pointer) if (!(pointer)) { \printf("FuncName: %-15s Line: %-5d ErrorCode: %-3d\n", __func__, __LINE__, ERR_NULL_PTR…

2023 年最新Java 毕业设计选题题目参考,500道 Java 毕业设计题目,值得收藏

大家好&#xff0c;我是程序员徐师兄&#xff0c;最近有很多同学咨询&#xff0c;说毕业设计了&#xff0c;不知道选怎么题目好&#xff0c;有哪些是想需要注意的。 确实毕设选题实际上对很多同学来说一个大坑&#xff0c; 每年挖坑给自己跳的人太多太多&#xff0c;选题选得好…

JavaScript关于对象的小挑战

让我们再来看看马克和约翰比较他们的体重指数的情况吧! 这一次&#xff0c;让我们用物体来实现计算! 记住&#xff1a;BMI质量/身高**2质量/&#xff08;身高*高度&#xff09;。(质量以公斤为单位&#xff0c;身高以米为单位) 为他们每个人创建一个对象&#xff0c;其属性为全…

MySQL触发器使用指南大全

一、介绍 触发器是与表有关的数据库对象&#xff0c;指在insert/update/delete之前或之后&#xff0c;触发并执行触发器中定义的SQL语句集合。触发器的这种特性可以协助应用在数据库端确保数据的完整性&#xff0c;日志记录&#xff0c;数据校验等操作。 使用别名OLD和NEW来引…

【操作系统实验】进程管理与内存分配模拟程序-含可运行有界面的Python代码

本文是博主之前做的操作系统实验&#xff0c;现在将完整代码和效果图免费放在下面&#xff0c;供大家参考&#xff0c;如果觉得有用&#xff0c;希望大家可以三连关注支持&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 实验目的 设计编写OS进程…

15. 线性代数 - 克拉默法则

文章目录 克拉默法则矩阵运算Hi,大家好。我是茶桁。 上节课我们在最后提到了一个概念「克拉默法则」,本节课,我们就来看看到底什么是克拉默法则。 克拉默法则 之前的课程我们一直在强调,矩阵是线性方程组抽象的来的。那么既然我们抽象出来了,有没有一种比较好的办法高效…

合宙Air724UG LuatOS-Air LVGL API控件-二维码(Qrcode)

二维码&#xff08;Qrcode&#xff09; 示例代码 qrcodelvgl.qrcode_create(lvgl.scr_act(),nil)lvgl.qrcode_set_txt(qrcode,"https://doc.openluat.com/home")lvgl.obj_set_size(qrcode,400,400)lvgl.obj_align(qrcode, nil, lvgl.ALIGN_CENTER, 0, 0)创建 可以通…

496. 下一个更大元素 I

class Solution { public:vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {// 存储numx2右侧第一个比它的元素数值std::unordered_map<int, int> index;std::stack<int> sta;for (int i nums2.size()-1; i &…

uniapp项目实践总结(十四)封装存储和路由方法

导语&#xff1a;在日常 APP 开发过程中&#xff0c;经常要用到数据的存储、获取和删除等操作以及页面导航之间的跳转&#xff0c;为此&#xff0c;封装了一个两个简单的方法来统一调用。 目录 原理分析方法实现实战演练案例展示 原理分析 主要是以下 API。 uni.setStorage…

xcode iOS 在app文件中开启访问 Document Directory

xcode iOS 在app文件中开启访问 Document Directory 在 Plist 中设置 LSSupportsOpeningDocumentsInPlace为 YES 且UIFileSharingEnabled为 YES &#xff08;这个不添加好像也可以&#xff09; 可以从系统的Files应用中访问应用的 Documents 目录 电脑 助手也可以访问 开…

视频号挂公众号链接最新教程方法,赶紧来看

玩视频号的朋友&#xff0c;尤其是靠挂公众号引流的朋友&#xff0c;肯定心里非常清楚&#xff0c;就在八月初&#xff0c;视频号放大招了&#xff0c;可以说这个大招是完全把公众号的路给堵死了&#xff0c;视频号出了什么新规呢&#xff0c;大家来看看。 第一个规则是&#…

无涯教程-JavaScript - IMTAN函数

描述 IMTAN函数以x yi或x yj文本格式返回复数的切线。复数的切线由以下公式计算- tan(z)正弦(z)/cos(z) 语法 IMTAN (inumber)争论 Argument描述Required/OptionalInumberA complex number for which you want the tangent.Required Notes Excel中的复数仅存储为文本。…

最新keil安装出现的无数问题记录及解决办法

报错问题现象如下&#xff1a; *** Target Target 1 uses ARM-Compiler Default Compiler Version 5 which is not available. 安装最新keil 5 出现无数个问题。 我使用GD32去跑&#xff0c;或者STM32去跑&#xff0c;都是这个问题。 一、我先解决了GD32的问题&#xff1a;…

阻塞队列学习总结

ArrayBlockingQueue&#xff1a;一个由数组结构组成的有界阻塞队列。 LinkedBlockingQueue&#xff1a;一个由链表结构组成的有界阻塞队列。 PriorityBlockingQueue&#xff1a;一个支持优先级排序的无界阻塞队列。 DelayQueue&#xff1a;一个使用优先级队列实现的延迟无界…

分库分表实战

数据分片与分片算法 分库分表的第一性原理&#xff0c;那就是&#xff1a;存储容量和性能容量。只有对核心业务表才会精心进行分库分表的设计。 首先我们了解一下数据分片是什么意思&#xff1f; 本质上的分库分表不就是数据分片吗&#xff1f;定义就是&#xff1a;按照某个…

BBR 带宽估计的延后累加

一个关于时延统计分布的小测试&#xff0c;用 netem delay jitter distribution pareto 模拟&#xff0c;得到下面的结果&#xff1a; netem 的 jitter 并不是真 jitter&#xff0c;只是通过延时阻滞部分报文模拟 jitter&#xff0c;对保序流而言&#xff0c;就表现为乱序&am…

搭建自己的OCR服务,第一步:选择合适的开源OCR项目

一、OCR是什么&#xff1f; 光学字符识别&#xff08;Optical Character Recognition, OCR&#xff09;是指对文本资料的图像文件进行分析识别处理&#xff0c;获取文字及版面信息的过程。 亦即将图像中的文字进行识别&#xff0c;并以文本的形式返回。 二、OCR的基本流程 1…

Science子刊 | 将CAR-T细胞疗法与造血干细胞移植相结合 或许 能治疗所有血液癌症...

来源&#xff1a;BRUNO DELESSARD/CHALLENGES-REA/REDUX 新的CAR-T细胞疗法有望能治疗几乎所有血液癌症。目前&#xff0c;该疗法已被批准用于五种亚型的血液癌症。宾夕法尼亚大学帕尔曼医学院的科学家们在预临床试验中展示了这种方法的潜在效能。 2023年8月31日&#xff0c;发…

动态路由的主流算法

路由器就是一台网络设备&#xff0c;它有多张网卡。当一个入口的网络包送到路由器时&#xff0c;它会根据一个本地的转发信息库&#xff0c;来决定如何正确地转发流量。这个转发信息库通常被称为路由表。 一张路由表中会有多条路由规则。每一条规则至少包含这三项信息。 目的…

vscode 调试 ROS2

1、在下列目录同层级找到.vscode文件夹 . ├── build ├── install ├── log └── src 2、 安装ros插件 3、创建tasks.json文件&#xff0c;添加下列内容 //代替命令行进行编译 {"version": "2.0.0","tasks": [{"label": &…