Java贪心算法(含面试大厂题和源码)

贪心算法是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是全局最好或最优的算法策略。贪心算法解决问题的过程中,每一步都做出一个看似最优的决定,它永远不会回溯,这种做法在很多情况下可以得到最优解,但在某些情况下可能不会得到全局最优解。

贪心算法的特点:

  • 局部最优选择:在每个步骤中,根据某种规则选择当前最优的解决方案。
  • 无回溯:一旦作出了选择,就不再改变。
  • 高效性:通常情况下,贪心算法可以快速找到解决方案,运行效率较高。
  • 应用范围有限:只有当问题满足贪心选择性质(即局部最优解能导致全局最优解)和最优子结构性质时,才能保证得到全局最优解。

贪心算法的应用实例包括:

  • 找零问题:如何用最少的硬币找零。
  • 背包问题:在不超过背包容量的前提下,如何选择物品以使得总价值最大(贪心算法解决的是背包问题的分数版本)。
  • 最小生成树问题:如Kruskal算法和Prim算法。
  • 单源最短路径问题:如Dijkstra算法。

贪心算法的设计思路通常包括两个主要部分:一是贪心策略,用于决定做出哪个选择;二是问题的约束条件,贪心策略需要在满足所有约束的前提下进行。

举一个简单的例子,假设你有面值为1元、2元、5元的硬币,需要支付9元,如何使用最少的硬币完成支付?按照贪心算法,我们每次选择能够支付的最大面值的硬币,直到完成支付。因此,首先选择一个5元的硬币,剩下4元,再选择两个2元的硬币,共使用了3枚硬币,这就是贪心算法的解决方案。

需要注意的是,贪心算法并不适用于所有问题,其正确性需要根据具体问题进行分析。在某些问题上,贪心策略可能无法得到全局最优解。当然,让我们来看三道常见的大厂面试题,这些题目不仅考察基本算法和数据结构的理解,还考验解题思路和编码能力。

题目1: 两数之和

问题描述
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。

示例:

给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

解题思路:
使用哈希表来减少查找时间,遍历数组,每个元素在哈希表中寻找是否存在一个数与当前元素相加等于目标值。

Java代码:

import java.util.HashMap;public class Solution {public int[] twoSum(int[] nums, int target) {HashMap<Integer, Integer> map = new HashMap<>();for (int i = 0; i < nums.length; i++) {if (map.containsKey(target - nums[i])) {return new int[]{map.get(target - nums[i]), i};}map.put(nums[i], i);}throw new IllegalArgumentException("No two sum solution");}
}

题目2: 二叉树的最大深度

问题描述
给定一个二叉树,找出其最大深度。

二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。

示例:
给定二叉树 [3,9,20,null,null,15,7]

返回它的最大深度 3 。

解题思路:
使用递归的方式,每次递归调用计算左子树和右子树的深度,最后取最大值加1(当前节点的深度)。

Java代码:

public class TreeNode {int val;TreeNode left;TreeNode right;TreeNode(int x) { val = x; }
}class Solution {public int maxDepth(TreeNode root) {if (root == null) return 0;int leftDepth = maxDepth(root.left);int rightDepth = maxDepth(root.right);return Math.max(leftDepth, rightDepth) + 1;}
}

题目3: 字符串的排列

问题描述
给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的排列。

换句话说,第一个字符串的排列之一是第二个字符串的子串。

示例1:

输入: s1 = "ab" s2 = "eidbaooo"
输出: True
解释: s2 包含 s1 的排列之一 ("ba").

解题思路:
滑动窗口法。用数组记录s1中每个字符的出现次数,然后用一个滑动窗口扫描s2,如果窗口中的字符和s1中字符出现的次数一致,则说明找到了一个匹配。

Java代码:

class Solution {public boolean checkInclusion(String s1, String s2) {int[] count = new int[26];for (char c : s1.toCharArray()) count[c - 'a']++;int start = 0, end = 0, len = s1.length();while (end < s2.length()) {if (count[s2.charAt(end++) - 'a']-- > 0) len--;if (len == 0) return true;if (end - start == s1.length() && count[s2.charAt(start++) - 'a']++ >= 0) len++;}return false;}
}

这些题目覆盖了数组、树、字符串和滑动窗口等常见算法和数据结构,希望对你的面试准备有所帮助!

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

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

相关文章

洛谷刷题 | B3623 枚举排列

枚举排列 题目描述 今有 n n n 名学生&#xff0c;要从中选出 k k k 人排成一列拍照。 请按字典序输出所有可能的排列方式。 输入格式 仅一行&#xff0c;两个正整数 n , k n, k n,k。 输出格式 若干行&#xff0c;每行 k k k 个正整数&#xff0c;表示一种可能的队…

2-Flume之Sink与Channel

Flume Sink HDFS Sink 将数据写到HDFS上。数据以文件形式落地到HDFS上&#xff0c;文件名默认是以FlumeData开头&#xff0c;可以通过hdfs.filePrefix来修改 HDFS Sink默认每隔30s会滚动一次生成一个文件&#xff0c;因此会导致在HDFS上生成大量的小文件&#xff0c;实际过程…

使用git下载github/gitee仓库部分或单个文件的方法

前言 有些时候在github或者gitee仓库中我们只需要下载整个项目中的我门需要的那一部分文件夹或文件就行了&#xff0c;不需要下载所有的项目。这样可以节省很多流量和时间 步骤 1.建立一个新的 git 本地仓库 这里我在D:\test中初始化 命令&#xff1a; git init2.在本地仓…

Istio 部署 Spring Coud 微服务应用

Istio 服务部署 这篇文章讲述如何将 Java Spring Cloud 微服务应用部署到 Istio mesh 中。 准备基础环境 使用 Kind 模拟 kubernetes 环境。文章参考&#xff1a;https://blog.csdn.net/qq_52397471/article/details/135715485 在 kubernetes cluster 中安装 Istio 创建一…

Excel双击单元格后弹窗输入日期

Step1. 在VBE界面新建一个窗体(Userform1),在窗体的工具箱的空白处右键,选中添加附件,勾选Calendar control 8.0,即可完成日历的添加。 PS:遗憾的是, Office 64 位没有官方的日期选择器控件。唯一的解决方案是使用Excel 的第三方日历。 参考链接:How to insert calen…

电路笔记 :灯光画 JLC 嘉立创EDA+PCB打样(笔记)

项目介绍 PCB板灯光画(可行性验证)&#xff0c;PCB灯光画无论是电路原理还是焊接都非常简单&#xff0c;所有元器件均采用0805及体积更大的封装&#xff0c;只需要电烙铁和焊锡丝等基础的工具就能制作&#xff0c;新手小白也能轻松复刻&#xff0c;里边还有PCB板实现灯光画效果…

数据交换技术

目录 <线路交换> <报文交换> <分组交换> 1.数据报分组交换 2.虚电路分组交换 计算机网络是以数据交换为目的的技术&#xff0c;从交换技术的发展过程来看&#xff0c;主要经历了线 路交换、报文交换、分组交换的过程。 <线路交换> 线路交换又称为…

【算法】归并排序(递归法)

目录 归并排序简介算法步骤(递归)C语言实现归并排序简介 归并排序(merge sort)是一种高效、通用且基于比较的排序算法。由约翰冯诺依曼(John von Neumann)于1945年发明,是一种分治算法(divide-and-conquer algorithm)。时间复杂度为 O ( n log ⁡ n ) O{\left(n\log …

Python调用上一级目录中的文件/模块(实测可正确导入)

#指定调用上一级别目录 conf中的文件 import sys import os.path sys.path.append(os.path.dirname(os.path.abspath(__file__)) "/../conf")#如果是上上级目录中的文件&#xff0c;使用 sys.path.append(os.path.dirname(os.path.abspath(__file__)) "/../..…

vue3+threejs新手从零开发卡牌游戏(十):创建己方战域

首先在game目录下创建site文件夹&#xff0c;用来存放战域相关代码&#xff1a; 这里思考下如何创建战域&#xff0c;我的想法是添加一个平面&#xff0c;将己方战域和对方战域都添加进这个平面中&#xff0c;所以首先我们先添加一个战域plane&#xff0c;site/index.vue代码如…

[蓝桥杯 2020 省 AB1] 网络分析

一开始写的暴力合并 卡n^2过的不是正解 看正解是类似 虚拟点树形DP的思路 很巧妙 记录一下 #include<bits/stdc.h> using namespace std; using ll long long; using pii pair<int,int>; #define int long long const int N 3e510; const int inf 0x3f3f3f3f; …

【生命周期】简述及部分软件知识补充

一 生命周期的概念 在编程中&#xff0c;生命周期是描述一个对象或组件从创建到销毁的整个过程。不同的编程语言和框架可能有不同的术语和具体实现&#xff0c;但其本质都是为了管理对象的状态和行为。 例如&#xff0c;在Java中&#xff0c;一个对象的生命周期包括以…

【RPG Maker MV 仿新仙剑 战斗场景UI (八)】

RPG Maker MV 仿新仙剑 战斗场景UI 八 状态及装备场景代码效果 状态及装备场景 本计划在战斗场景中直接制作的&#xff0c;但考虑到在战斗场景中加入太多的窗口这不太合适&#xff0c;操作也繁琐&#xff0c;因此直接使用其他场景。 代码 Pal_Window_EquipStatus.prototype.…

Word邮件合并

Word邮件合并功能可以解决在Word中批量填写内容的需求&#xff0c;当需要大量格式相同&#xff0c;只修改少数相关内容时&#xff0c;例如利用Word制作工资条&#xff0c;通知函&#xff0c;奖状等等&#xff0c;同时操作也非常简单灵活。下面通过例子来说明邮件合并的使用方法…

突破距离限制 远程级联测径仪 让您使用更安心!

关键词&#xff1a;在线测径仪,测径仪,远程级联 在现代工业领域&#xff0c;测量的准确性和高效性至关重要。在线测径仪不仅具备了这两项特质&#xff0c;更能进行远程级联&#xff0c;能更快速的为您解决软件系统在使用中遇到的问题。 在线测径仪能做到以下几点 精准测量&am…

过了30岁,要具备翻篇的能力

哈喽&#xff0c;你好啊&#xff0c;我是雷工&#xff01; 杨绛先生曾经说过&#xff1a; “人生没有彩排&#xff0c;每一天都是现场直播。只有翻篇&#xff0c;才能重新开始。” 一个人如果整天回顾以前&#xff0c;想着自己做的不好的事情&#xff0c;想着曾经遇到的挫折&am…

vue.js制作学习计划表案例

通俗易懂&#xff0c;完成“学习计划表”用于对学习计划进行管理&#xff0c;包括对学习计划进行添加、删除、修改等操作。 一. 初始页面效果展示 二.添加学习计划页面效果展示 三.修改学习计划完成状态的页面效果展示 四.删除学习计划 当学习计划处于“已完成”状态时&…

Vue使用font-face自定义字体详解

目录 1 介绍2 使用2.1 语法2.2 属性说明2.3 Vue使用案例2.3.1 全局定义字体2.3.2 在页面使用 3 注意事项 1 介绍 font-face 是 CSS 中的一个规则&#xff0c;它允许你加载服务器上的字体文件&#xff08;远程或者本地&#xff09;&#xff0c;并在网页中使用这些字体。这样&am…

2024年3月26日 十二生肖 今日运势

小运播报&#xff1a;2024年3月26日&#xff0c;星期二&#xff0c;农历二月十七 &#xff08;甲辰年丁卯月己丑日&#xff09;&#xff0c;法定工作日。 红榜生肖&#xff1a;鸡、鼠、猴 需要注意&#xff1a;马、狗、羊 喜神方位&#xff1a;东北方 财神方位&#xff1a;…

VUE父子组件的传参问题

1.父组件向子组件传参 1&#xff09;这是一个父组件 //这是一个父组件 <div> <port :port-List"portList" ></port> </div> //port 这是子组件的名称export default{components: {},props: {},data() {return{portList:,}},computed: {}…