java-5 道经典算法题

字符串处理、动态规划、递归和二分查找等方面。通过详细的题目描述、解题思路和完整的代码示例,展示了如何在实际开发中应用这些经典算法。以下是对每道题目和对应算法的进一步探讨和总结。

### 1. 求数组的最大子数组和

#### 进一步探讨

最大子数组和问题是一个经典的动态规划问题。其核心在于定义一个状态数组 `dp`,并通过迭代的方式逐步求解子问题。关键在于如何定义状态转移方程,以便能够高效地计算出结果。

通过动态规划,我们将时间复杂度从朴素的 O(n^3) 或 O(n^2) 降低到 O(n)。这种方法也被称为 Kadane's Algorithm,是处理此类问题的最优解法之一。

#### 优化和改进

在实际应用中,我们可以进一步优化空间复杂度。由于我们只需要当前和前一个状态的值,因此可以使用两个变量而不是整个数组来保存状态,从而将空间复杂度降低到 O(1)。

```java
public class MaxSubArraySumOptimized {
    public static int maxSubArray(int[] nums) {
        int maxSum = nums[0];
        int currentSum = nums[0];
        
        for (int i = 1; i < nums.length; i++) {
            currentSum = Math.max(nums[i], currentSum + nums[i]);
            maxSum = Math.max(maxSum, currentSum);
        }
        
        return maxSum;
    }

    public static void main(String[] args) {
        int[] nums = {-2, 1, -3, 4, -1, 2, 1, -5, 4};
        System.out.println("Maximum subarray sum is " + maxSubArray(nums));
    }
}
```

### 2. 斐波那契数列

#### 进一步探讨

斐波那契数列是一个基础的递归问题,也可以通过动态规划来解决。递归解法尽管直观,但存在大量重复计算,对于较大 n 会导致时间复杂度指数增长。

通过动态规划,我们可以在迭代过程中保存中间结果,从而避免重复计算。利用数组来保存所有中间结果,或者使用两个变量保存最近的两个结果,可以显著提高效率。

#### 优化和改进

使用动态规划的思路,可以进一步优化为只使用两个变量保存最近的两个结果,降低空间复杂度。

```java
public class FibonacciOptimized {
    public static int fib(int n) {
        if (n <= 1) {
            return n;
        }
        int a = 0, b = 1;
        for (int i = 2; i <= n; i++) {
            int next = a + b;
            a = b;
            b = next;
        }
        return b;
    }

    public static void main(String[] args) {
        int n = 10;
        System.out.println("Fibonacci number at position " + n + " is " + fib(n));
    }
}
```

### 3. 字符串的全排列

#### 进一步探讨

全排列问题是一个典型的回溯问题。回溯算法通过选择、撤销选择的方式递归地生成所有可能的排列。核心在于如何有效地实现选择和撤销选择的操作。

#### 优化和改进

为了进一步优化,可以考虑在每次递归时避免不必要的交换操作,并通过标记数组来记录哪些字符已经被使用,避免重复计算。

```java
import java.util.ArrayList;
import java.util.List;

public class PermutationsOptimized {
    public static List<String> permute(String str) {
        List<String> result = new ArrayList<>();
        boolean[] used = new boolean[str.length()];
        permuteHelper(str.toCharArray(), used, new StringBuilder(), result);
        return result;
    }

    private static void permuteHelper(char[] chars, boolean[] used, StringBuilder sb, List<String> result) {
        if (sb.length() == chars.length) {
            result.add(sb.toString());
            return;
        }
        
        for (int i = 0; i < chars.length; i++) {
            if (used[i]) continue;
            used[i] = true;
            sb.append(chars[i]);
            permuteHelper(chars, used, sb, result);
            used[i] = false;
            sb.deleteCharAt(sb.length() - 1);
        }
    }

    public static void main(String[] args) {
        String str = "abc";
        List<String> permutations = permute(str);
        System.out.println("Permutations of " + str + ": " + permutations);
    }
}
```

### 4. 二分查找

#### 进一步探讨

二分查找是一种高效的搜索算法,时间复杂度为 O(log n)。其核心思想是通过不断将搜索范围减半,快速缩小查找范围。二分查找适用于有序数组或可以按某种顺序排列的数据结构。

#### 优化和改进

可以在实现中添加更多的边界检查和优化,确保算法的健壮性。

```java
public class BinarySearchEnhanced {
    public static int searchInsert(int[] nums, int target) {
        if (nums == null || nums.length == 0) {
            return 0;
        }
        int left = 0, right = nums.length - 1;
        while (left <= right) {
            int mid = left + (right - left) / 2;
            if (nums[mid] == target) {
                return mid;
            } else if (nums[mid] < target) {
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        }
        return left;
    }

    public static void main(String[] args) {
        int[] nums = {1, 3, 5, 6};
        int target = 5;
        System.out.println("Target position: " + searchInsert(nums, target));

        target = 2;
        System.out.println("Target position: " + searchInsert(nums, target));
    }
}
```

### 5. 最长公共子序列

#### 进一步探讨

最长公共子序列问题是一个经典的动态规划问题。通过定义状态数组 `dp` 并逐步计算子问题的解,可以高效地解决这个问题。动态规划的核心在于如何定义状态和状态转移方程。

#### 优化和改进

为了降低空间复杂度,可以使用滚动数组技术,只保存最近两行的状态,从而将空间复杂度从 O(m * n) 降低到 O(n)。

```java
public class LongestCommonSubsequenceOptimized {
    public static int longestCommonSubsequence(String s1, String s2) {
        int m = s1.length();
        int n = s2.length();
        int[] dp = new int[n + 1];
        int[] prev = new int[n + 1];

        for (int i = 1; i <= m; i++) {
            for (int j = 1; j <= n; j++) {
                if (s1.charAt(i - 1) == s2.charAt(j - 1)) {
                    dp[j] = prev[j - 1] + 1;
                } else {
                    dp[j] = Math.max(dp[j - 1], prev[j]);
                }
            }
            int[] temp = prev;
            prev = dp;
            dp = temp;
        }
        return prev[n];
    }

    public static void main(String[] args) {
        String s1 = "abcde";
        String s2 = "ace";
        System.out.println("Longest common subsequence length: " + longestCommonSubsequence(s1, s2));
    }
}
```

### 总结

这些算法题目展示了如何在Java中应用经典算法解决实际问题。通过详细的解题思路和优化代码,开发者可以深入理解这些算法的核心思想和实现技巧。在实际开发中,掌握这些算法不仅有助于提高编码能力,还能提升问题解决的效率和代码质量。

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

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

相关文章

【图说中国】大江大河你知道哪些?

【图说中国】大江大河你知道哪些&#xff1f; 中国河流 中国是世界上河流最多国家之一&#xff0c;其中流域面积超过1000平方米河流就有1500多条。 主要有长江、黄河、黑龙江、珠江、淮河、海河、辽河、雅鲁藏布江、塔里木河、澜沧江、怒江、闽江、钱塘江、韩江、鸭绿江、图…

Pandas函数详解:案例解析(第25天)

系列文章目录 Pandas函数详解排序函数聚合函数缺失值处理日期函数 文章目录 系列文章目录前言1 索引和列名操作1.1 查看索引和列名1.2 修改索引和列名 2 常用计算函数2.1 排序函数2.2 聚合函数2.3 练习 3 缺失值处理3.1 缺失值概念3.2 加载包含缺失值数据3.3 查看缺失值3.4 缺失…

十五、【源码】给代理对象设置属性

源码地址&#xff1a;https://github.com/spring-projects/spring-framework 仓库地址&#xff1a;https://gitcode.net/qq_42665745/spring/-/tree/15-proxy-set-property 给代理对象设置属性 之前的代码是创建Bean进行判断&#xff0c;要不要进行代理&#xff0c;如果代理…

物联网应用Fast ingest

一、原文路径 Tuning the System Global Area 二、翻译 1、原理 Fast ingest 优化是针对高并发&#xff0c;单行数据的插入这种场景的。比如IOT应用采集&#xff08;很符合国网的用采数据场景&#xff09;。 Fast ingest 使用MEMOPTIMIZE_WRITE 提示来插入数据到 MEMOPTIM…

LVM负载均衡群集

一.群集基础概述 1.群集的类型 &#xff08;1&#xff09;负载均衡的群集&#xff1a;以提高应用系统的响应能力&#xff0c;尽可能处理更多的访问请求&#xff0c;减少延迟为目标&#xff0c;获得高并发的、高负载的整体性能。例如&#xff1a;“DNS轮询”&#xff0c;“应用…

.net 快速开发框架开源

DF.OpenAPI开源系统 前后端分离&#xff0c;开箱即用&#xff0c;java经典功能.net也具备 系统介绍 DF.OpenAPI是基于Admin.NET二开的&#xff0c;是一个开源的多租户后台管理系统。采用前后端分离技术&#xff08;前端使用vue.js&#xff0c;后端使用.net 3~.net6&#xff…

SyntaxError: invalid character in identifier 解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

鸿翼全链智能知识管理,打造大模型时代的企业知识管理新范式

在知识经济的浪潮中&#xff0c;知识已成为企业构筑竞争优势的基石。随着大模型转向应用落地&#xff0c;其强大的语义理解、推理、逻辑、记忆等能力&#xff0c;推动企业知识管理迈向一个“智能涌现”的新时代。 鸿翼大模型KM知识管理系统&#xff0c;植根于非结构化数据治理全…

Mac安装nvm,node

新的Mac安装nvm&#xff0c;最简单的是先安装nvm&#xff0c;再安装node&#xff0c;官网示例代码也是这么整的&#xff0c;如果已经安装了node&#xff0c;不要慌 多几步终端操作可以“没有如果”。分两种情况&#xff1a;1&#xff0c;还没安装node&#xff0c;直接装nvm&…

【C++】初步认识C++

1. 初识C1.1 C概念相关1.2 C发展史及其重要性1.2.1 发展史1.2.2 重要性 2. C关键字3. 命名空间4. 输入和输出 个人主页&#xff1a;C_GUIQU 归属专栏&#xff1a;【C学习】 1. 初识C 1.1 C概念相关 C语言是结构化和模块化的语言&#xff0c;适合处理较小规模的程序。 【来源】…

ctfshow-web入门-命令执行(web118详解)Linux 内置变量与Bash切片

输入数字和小写字母&#xff0c;回显 evil input 查看源码&#xff0c;发现这里会将提交的参数 code 传给 system 函数 使用 burpsuite 抓包进行单个字符的模糊测试 fuzz&#xff1a; 发现过滤掉了数字和小写字母以及一些符号&#xff0c;下面框起来的部分是可用的 结合题目提…

【C++】开源:命令行解析库CLI11配置与使用

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍命令行解析库CLI11配置与使用。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#x…

ETCD概述--使用/特性/架构/原理

ETCD概述 ETCD是一个高度一致的分布式键值存储, 它提供了一种可靠的方式来存储需要由分布式系统或机器集群访问的数据(高可用, 强一致性)​全局的配置服务中心. 本文将介绍其特性、相关操作和常见的应用场景. 如果想了解更多, 请查阅我的技术博客: https://dingyuqi.com 特性 …

新章节:全设备通用调度算法-通讯重构

新章节&#xff1a;全设备通用调度算法-通讯重构 文章目录 新章节&#xff1a;全设备通用调度算法-通讯重构前言一、重构了TCP和UDP通讯二、优化了OPC和OPCUA三、升级了监控客户端四、升级了通讯的图形化其他升级 前言 现在真的很懒也很少写代码了&#xff0c;写代码和更新进度…

webSocket网页通信---使用js模拟多页面实时通信

webSocket是什么 WebSocket是一种先进的网络技术&#xff0c;它提供了一种在单个TCP连接上进行全双工通信的能力。传统的基于HTTP的通信是单向的&#xff0c;即客户端发起请求&#xff0c;服务器响应请求&#xff0c;然后连接关闭。但是&#xff0c;WebSocket允许服务器和客户端…

欧盟,又出了新规-通用充电器新规通用充電器的 RED 修正案如何办理?

欧盟&#xff0c;又出了新规-通用充电器新规通用充電器的 RED 修正案如何办理&#xff1f; 欧盟新规委员会发布《通用充电器指令》指南通用充電器的 RED 修正案办理流程&#xff1a; 2024年5月7日&#xff0c;欧盟委员会发布《通用充电器指令》指南&#xff0c;修订了《无线…

Linux之进程控制(下)

目录 进程替换的概念 进程替换的函数 execl​编辑 execlp execle execv execvp execve 上期&#xff0c;我们学习了进程创建&#xff0c;进程终止和进程等待&#xff0c;今天我们要学习的是进程控制中相对重要的板块------进程替换。 进程替换的概念 在进程创建时&…

【 香橙派 AIpro评测】大语言模型实战教程:香橙派 AIpro部署LLMS大模型实站(保姆级教学)

引言 OrangePi AIpro 这块板子作为业界首款基于昇腾深度研发的AI开发板&#xff0c;一经发布本博主就火速去关注了&#xff0c;其配备的 8/20TOPS澎湃算力是目前开发板市场中所具备的最大算力&#xff0c;可谓是让我非常眼馋啊&#xff01;这么好的板子那必须拿来用用&#xff…

LeetCode热题100刷题6:160. 相交链表、206. 反转链表、234. 回文链表、141. 环形链表、142. 环形链表 II

160. 相交链表 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*/ class Solution { public:ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {ListNode…

QDockWidget类详解

一.QDockWidget类概述 1.QDockWidget类 QDockWidget类提供了一个特殊的窗口部件&#xff0c;它可以是被锁在QMainWindow窗口内部或者是作为顶级窗口悬浮在桌面上。 QDockWidget类提供了dock widget的概念&#xff0c;dock widget也就是我们熟悉的工具面板或者是工具窗口。Do…