【LeetCode每日一题合集】2023.8.7-2023.8.13(动态规划分治)

news2024/11/25 22:34:49

文章目录

344. 反转字符串

https://leetcode.cn/problems/reverse-string/description/

在这里插入图片描述

要求原地修改,使用双指针两两交换位置就好了。

class Solution {
    public void reverseString(char[] s) {
        for (int l = 0, r = s.length - 1; l < r; ++l, --r) {
            char t = s[l];
            s[l] = s[r];
            s[r] = t;
        }
    }
}

1749. 任意子数组和的绝对值的最大值(最大子数组和)

https://leetcode.cn/problems/maximum-absolute-sum-of-any-subarray/description/
在这里插入图片描述
提示:
1 <= nums.length <= 10^5
-10^4 <= nums[i] <= 10^4

参考最大子数组和那道题。
这道题的区别就是维护一个最大值和一个最小值,更新答案时用最大值和最小值取反来更新答案。

class Solution {
    public int maxAbsoluteSum(int[] nums) {
        int mx = 0, mn = 0, ans = 0;
        for (int num: nums) {
            mx = mx + num < num? num: mx + num;
            mn = mn + num > num? num: mn + num;
            ans = Math.max(ans, Math.max(mx, -mn));
        }
        return ans;
    }
}

1281. 整数的各位积和之差

1281. 整数的各位积和之差

在这里插入图片描述
提示:
1 <= n <= 10^5

模拟即可。

class Solution {
    public int subtractProductAndSum(int n) {
        int mul = 1, sum = 0;
        while (n != 0) {
            int v = n % 10;
            n /= 10;
            mul *= v;
            sum += v;
        }
        return mul - sum;
    }
}

1289. 下降路径最小和 II

https://leetcode.cn/problems/minimum-falling-path-sum-ii/description/

在这里插入图片描述

提示:
n == grid.length == grid[i].length
1 <= n <= 200
-99 <= grid[i][j] <= 99

解法1——动态规划 O ( n 3 ) O(n^3) O(n3)

从数据范围来看,可以使用 O ( n 3 ) O(n^3) O(n3)的算法。
对于每个位置,选择上一行中最小的那个位置递推过来即可。

class Solution {
    public int minFallingPathSum(int[][] grid) {
        int m = grid.length, n = grid[0].length;
        // 枚举第1~m-1行
        for (int i = 1; i < m; ++i) {
            // 枚举当前行的0~n-1列
            for (int j = 0; j < n; ++j) {
                // 枚举上一行的0~n-1列,选出其中最小的
                int v = Integer.MAX_VALUE;
                for (int k = 0; k < n; ++k) {
                    if (k != j) v = Math.min(v, grid[i - 1][k]);
                }
                grid[i][j] += v;
            }
        }
        return Arrays.stream(grid[m - 1]).min().getAsInt();
    }
}

解法2——转移过程优化 O ( n 2 ) O(n^2) O(n2)

在状态转移的过程中可以发现,第 i 行的很多位置是从 i - 1 行的同一列转移过来的,因为他们都会优先选择第 i - 1 行的最小值,只有当列相同时才会去选择次小值。
因此我们只需要维护三个变量:最小值、最小值对应的列、次小值 即可,不需要完整枚举上一行的每一列。

class Solution {
    public int minFallingPathSum(int[][] grid) {
        int n = grid.length;
        int mn = 0, mn2 = 0, mnId = -1;

        // 枚举每一行
        for (int i = 0; i < n; ++i) {
            // 当前行的最小值、次小值、最小值下标
            int curMn = Integer.MAX_VALUE, curMn2 = Integer.MAX_VALUE, curMnId = -1;

            // 枚举每一列
            for (int j = 0; j < n; ++j) {
                int curSum = (j != mnId? mn: mn2) + grid[i][j];
                // 使用当前和更新最小值和次小值
                if (curSum < curMn) {
                    curMn2 = curMn;
                    curMn = curSum;
                    curMnId = j;
                } else if (curSum < curMn2) {
                    curMn2 = curSum;
                }
            }

            // 更新上一行的最小值、次小值、最小值下标
            mn = curMn;
            mn2 = curMn2;
            mnId = curMnId;
        }
        return mn;
    }
}

优化之后,执行用时从 32ms 变成了 1ms。效果显著。

1572. 矩阵对角线元素的和

https://leetcode.cn/problems/matrix-diagonal-sum/
在这里插入图片描述

提示:
n == mat.length == mat[i].length
1 <= n <= 100
1 <= mat[i][j] <= 100

解法1——加的时候判断

class Solution {
    public int diagonalSum(int[][] mat) {
        int n = mat.length, ans = 0;
        for (int i = 0; i < n; ++i) {
            ans += mat[i][i];
            if (n - 1 - i != i) ans += mat[i][n - 1 - i];
        }
        return ans;
    }
}

解法2——加完之后判断

循环里面不用写 if 了,最后判断一下 n 是奇数还是偶数就好了。

class Solution {
    public int diagonalSum(int[][] mat) {
        int n = mat.length, ans = 0;
        for (int i = 0; i < n; ++i) {
            ans += mat[i][i] + mat[i][n - 1 - i];
        }
        return ans - mat[n / 2][n / 2] * (n & 1);
    }
}

23. 合并 K 个升序链表

https://leetcode.cn/problems/merge-k-sorted-lists/

在这里插入图片描述
提示:
k == lists.length
0 <= k <= 10^4
0 <= lists[i].length <= 500
-10^4 <= lists[i][j] <= 10^4
lists[i] 按 升序 排列
lists[i].length 的总和不超过 10^4

解法1——使用优先队列合并

将 k 个链表放入优先队列中,每次取出最小的,使用后再将其 next 节点放入优先队列即可。

class Solution {
    public ListNode mergeKLists(ListNode[] lists) {
        PriorityQueue<ListNode> pq = new PriorityQueue<>((a, b) -> a.val - b.val);
        for (ListNode list: lists) {
            if (list != null) pq.offer(list);
        }
        ListNode dummy = new ListNode(-1), prev = dummy;
        while (!pq.isEmpty()) {
            ListNode cur = pq.poll();
            prev.next = cur;
            prev = cur;
            if (cur.next != null) pq.offer(cur.next);
        } 
        return dummy.next;
    }
}

解法2——分治合并⭐

在这里插入图片描述

类似于归并排序时使用的思想,两两处理,向上归并。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode mergeKLists(ListNode[] lists) {
        return mergeKLists(lists, 0, lists.length);
    }

    public ListNode mergeKLists(ListNode[] lists, int i, int j) {
        int m = j - i;      // 这段区间的长度
        if (m == 0) return null;
        if (m == 1) return lists[i];
        // 分成左右两个区间处理
        ListNode left = mergeKLists(lists, i, i + m / 2);
        ListNode right = mergeKLists(lists, i + m / 2, j);
        return mergeTwoLists(left, right);
    }

    public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
        ListNode dummy = new ListNode();    // 用哨兵节点简化代码逻辑
        ListNode cur = dummy;
        while (list1 != null && list2 != null) {
            if (list1.val < list2.val) {
                cur.next = list1;
                list1 = list1.next;
            } else {
                cur.next = list2;
                list2 = list2.next;
            }
            cur = cur.next;
        }
        cur.next = list1 != null? list1: list2;
        return dummy.next;
    }
}

这两种解法的时间复杂度都是 O ( n ∗ log ⁡ k ) O(n*\log{k}) O(nlogk)

88. 合并两个有序数组

https://leetcode.cn/problems/merge-sorted-array/

在这里插入图片描述

提示
nums1.length == m + n
nums2.length == n
0 <= m, n <= 200
1 <= m + n <= 200
-10^9 <= nums1[i], nums2[j] <= 10^9

进阶:你可以设计实现一个时间复杂度为 O(m + n) 的算法解决此问题吗?

解法——逆向双指针

class Solution {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        int i = m - 1, j = n - 1, k = m + n - 1;
        while (i >= 0 && j >= 0) {
            if (nums1[i] >= nums2[j]) nums1[k--] = nums1[i--];
            else nums1[k--] = nums2[j--];
        }
        while (i >= 0) nums1[k--] = nums1[i--];
        while (j >= 0) nums1[k--] = nums2[j--];
    }
}

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

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

相关文章

13.Redis 事务

Redis 事务 redis 事务事务操作multi 开启事务exec 执行事务discard 放弃当前事务watchunwatch redis 事务 Redis 的事务和 MySQL 的事务概念上是类似的。 都是把⼀系列操作绑定成⼀组。 让这⼀组能够批量执⾏。 Redis 的事务和 MySQL 事务的区别: 弱化的原⼦性: 这里指的是 …

Pinely Round 2 (Div. 1 + Div. 2) G. Swaps(组合计数)

题目 给定一个长度为n(n<1e6)的序列&#xff0c;第i个数ai(1<ai<n)&#xff0c; 操作&#xff1a;你可以将当前i位置的数和a[i]位置的数交换 交换可以操作任意次&#xff0c;求所有本质不同的数组的数量&#xff0c;答案对1e97取模 思路来源 力扣群 潼神 心得 感…

huggingface下载模型文件(基础入门版)

huggingface是一个网站&#xff0c;类似于github&#xff0c;上面拥有众多开源的模型、数据集等资料&#xff0c;人工智能爱好者可以很方便的上面获取需要的数据&#xff0c;也可以上传训练好的模型&#xff0c;制作的数据集等。本文只介绍下载模型的方法&#xff0c;适合新手入…

SpringBoot连接MySQL数据库,使用Mybatis框架(入门)

1. 说明 SpringBoot项目&#xff0c;连接MySQL数据库&#xff0c;使用Mybatis框架。 本篇文章作为 SpringBoot 使用 Mybatis 的入门。 2. 依赖 2.1. MySQL驱动依赖 MySQL驱动&#xff0c;使用SpringBoot版本对应的默认版本&#xff0c;不需要手动指定版本。 比如&#xf…

【狂神】Spring5 (三) 之Aop的实现方式

今天没有偷懒&#xff0c;只是忘了Mybatis&#xff0c;所以去补课了~ ┏━━━━━━━━━━━━━━━┓ NICE PIGGY PIG.. ┗━━━━━━━△━━━━━━━┛ ヽ(&#xff65;ω&#xff65;)&#xff89; | / UU 1.Aop实现方式一 1.1、什…

UG\NX CAM二次开发 查询工序所在的方法组TAG UF_OPER_ask_method_group

文章作者:代工 来源网站:NX CAM二次开发专栏 简介: UG\NX CAM二次开发 查询工序所在的方法组TAG UF_OPER_ask_method_group 效果: 代码: void MyClass::do_it() { int count=0;tag_t * objects;UF_UI_ONT_ask_selected_nodes(&count, &objects);for (i…

Multimedia-播放器-架构2

目录 引言 问题1&#xff1a; 数据缓冲区 多线程模型 缓冲区的特点&#xff1a; 点播和直播场景中的缓冲区&#xff1a; 问题2&#xff1a; 同步方式 同步实现过程 引言 上一篇梳理了播放器的基本工作与处理流程&#xff0c;本片内容主要梳理一下其中会遇到的问题&am…

桂理理工大题

#include <stdio.h> #include <stdlib.h>int getMax(int n); int getMin(int n); int range(int n); static int count1; //作为全局变量控制每次的序列号int main(){int num;int i,j;do{printf("输入黑洞数&#xff1a;\n");scanf("%d",&…

Jdk8 动态编译 Java 源码为 Class 文件(三)

Jdk8 动态编译 Java 源码为 Class 文件 一.JDK版本二.工程介绍1.依赖2.启动类3.配置类&#xff08;用于测试依赖注入&#xff09;4.工具类1.Java 源码文件读取类2.SpringBoot 容器实例管理类 5.测试类1.抽象类2.接口类3.默认抽象实现4.默认接口实现 6.接口类1.测试接口2.类重载…

数学建模:模糊综合评价分析

&#x1f506; 文章首发于我的个人博客&#xff1a;欢迎大佬们来逛逛 数学建模&#xff1a;模糊综合评价分析 文章目录 数学建模&#xff1a;模糊综合评价分析综合评价分析常用评价方法一级模糊综合评价综合代码 多级模糊综合评价总结 综合评价分析 构成综合评价类问题的五个…

Emmet 使用笔记小结

Emmet 使用笔记小结 最近在跟视频走 CSS 的教程&#xff0c;然后要写很多的 HTML 结构&#xff0c;就想着总结一下 Emmet 的语法。 Emmet 是一个工具可以用来加速 HTML 和 CSS 的开发过程&#xff0c;不过 emmet 只支持 HTML & XML 文件结构&#xff0c;所以我个人觉得对…

【JavaSE】面试01

文章目录 1. JDK、JRE、JVM之间的关系2. 补充3. 面试题&#xff1a;重载和重写的区别&#xff1f;4. super和this5. &#xff08;重点&#xff01;&#xff01;&#xff09;若父类和子类均有静态代码块、实例代码块以及无参构造方法&#xff0c;则继承关系上的执行顺序&#xf…

如何解决分库分表主键问题?

分析&回答 从问题角度出发&#xff1a;我们需要一个全局唯一的 id 来支持&#xff0c;排序问题等。这都是你实际生产环境中必须考虑的问题。可以先看下我们之前的文章分布式系统唯一ID如何生成&#xff1f; 雪花算法和雪花算法的变种是大家常用的 喵呜面试助手&#xff1…

Python字节码文件

迷途小书童的 Note 读完需要 5分钟 速读仅需 2 分钟 大家好&#xff0c;我是迷途小书童&#xff01; 今天给大家介绍一个神奇的文件 -- pyc 文件&#xff0c;它能加速 Python 程序的执行速度&#xff0c;同时也能起到保护源码的作用。 1 什么是 pyc 文件? pyc 文件是经过编译的…

PYTHON-“人生重开模拟器“

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是Aileen★。希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f194;本文由 Aileen_0v0★ 原创 CSDN首发&#x1f412; 如需转载还…

SAP-PP:基础概念笔记-5(物料主数据的MRP1~4视图)

文章目录 前言一、MRP1视图Base Unit of Measure&#xff08;UoM&#xff09;MRP 组采购组ABC 指示器Plant-Specific Material Status 特定的工厂物料状态MRP 类型 MRP TypeMRP 类型 MRP TypeMaster Production Scheduling(MPS) 主生产计划基于消耗的计划(CBP)再订货点Reorder-…

【业务功能篇91】微服务-springcloud-多线程-线程池执行顺序

一、线程的实现方式 1. 线程的实现方式 1.1 继承Thread class ThreadDemo01 extends Thread{Overridepublic void run() {System.out.println("当前线程:" Thread.currentThread().getName());} }1.2 实现Runnable接口 class ThreadDemo02 implements Runnable{…

介绍几个搜索引擎

Google&#xff1a;全球最大的搜索引擎&#xff0c;提供全面的搜索服务&#xff0c;包括网页、图片、视频、新闻、地图等。 Baidu&#xff1a;中国最大的搜索引擎&#xff0c;提供类似于Google的全面搜索服务&#xff0c;同时也有网盘、知道等功能。 Bing&#xff1a;微软公司…

Linux持续学习者的实用命令:sed

引言 作为一名Linux持续学习者&#xff0c;我们经常需要对文本内容进行处理或修改&#xff0c;这时候sed命令就能派上用场了。sed是一个强大的流式文本编辑器&#xff0c;它可以在读取文本时进行修改并输出&#xff0c;支持各种复杂的字符串替换、内容删除、行插入等操作。在本…

Linux的目录结构特点

Linux的目录结构特点 1、使用树形目录结构来组织和管理文件。 2、整个系统只有一个根目录&#xff08;树根&#xff09;&#xff0c;Linux的根目录用“/”表示。 3、其他所有分区以及外部设备&#xff08;如硬盘&#xff0c;光驱等&#xff09;都是以根目录为起点&#xff0…