当前位置: 首页 > news >正文

数据结构与算法--其他算法

数据结构与算法--其他算法

  • 1 汉诺塔问题
  • 2 字符串的全部子序列
  • 3 字符串的全排列
  • 4 纸牌问题
  • 5 逆序栈问题
  • 6 数字和字符串转换问题
  • 7 背包问题
  • 8 N皇后问题

暴力递归就是尝试
1,把问题转化为规模缩小了的同类问题的子问题
2,有明确的不需要继续进行递归的条件(base case)
3,有当得到了子问题的结果之后的决策过程
4,不记录每一个子问题的解

 


 

1 汉诺塔问题

 

打印n层汉诺塔从最左边移动到最右边的全部过程

如下图所示,把 A 上的方块从移动到 C 上,要求 在移动的过程中 ,小的块在大的块上面

假设有三个点 : from to other,有 i 个方块
问题可以转换成 将 1 ~ i个圆盘从from点移动到to 点,过程如下 :

  1. 1 ~ (i - 1)个方块从 from 点移动到 other
  2. 将 第i个方块从 from点移动到 to
  3. i - 1个方块从 other点移动到 to

如下所示

1)
在这里插入图片描述
 

2)
在这里插入图片描述

 

3)
在这里插入图片描述

coding

public class HanoiTest {public static void main(String[] args) {hanoi(20);System.out.println(iCount);}public static int iCount = 0;public static void hanoi(int n) {if (n > 0) {func(n, "A", "B", "C");}}public static void func(int i, String start, String end, String other) {if (i == 1) {System.out.println("move 1 from " + start + " to " + end);iCount ++;} else {func(i - 1, start, other, end);iCount ++;System.out.println("move " + i + " from " + start + " to " + end);func(i - 1, other, end, start);}}
}

 


 

2 字符串的全部子序列

 

假设有字符串 abc ,要求打印出 abc的全部子序列

可根据包不包含每个字符 构建如图所示的二叉树
在这里插入图片描述

coding

public class PrintAllSubSequenceTest {public static void main(String[] args) {List<String> list = processIteration("abc".toCharArray());for (String s : list) {System.out.println(s);}}public static List<String> characterList = new ArrayList<>();public static List<String> getAllSubSequence(String parentStr) {characterList.clear();process(parentStr.toCharArray(), 0);return characterList;}/*** 当前来到了 i 位置 子序列中要和不要改字符走两条路** @param chars* @param i*/public static void process(char[] chars, int i) {// 到了最后一个位置if (i == chars.length) {characterList.add(String.valueOf(chars));return;}process(chars, i + 1);// 要 i 位置字符的路char temp = chars[i];chars[i] = 0;process(chars, i + 1);// 要 i 位置字符的路chars[i] = temp; //把字符串还原}/*** 使用迭代的方法** @param chars*/public static List<String>  processIteration(char[] chars) {List<String> retList = new ArrayList<>();for (int i = 0; i < chars.length;i++) {String str = "";for (int j = i ; j < chars.length;j++){str += chars[j];retList.add(str);}}return retList;}
}

 


 

3 字符串的全排列

 

打印一个字符串的全部排列

public class StringPermutationTest {public static void main(String[] args) {List<String> strings = getAllSubPermutation("abc");for (String s : strings) {System.out.println(s);}}public static List<String> getAllSubPermutation(String str){List<String> subPermutationList = new ArrayList<>();if (str == null || str.length() == 0){return subPermutationList;}process(0,str.toCharArray(),subPermutationList);return subPermutationList;}/*** 当前来到的是 i 位置* str[0..i-1]是之前做的选择* @param i* @param str* @param retList*/public static void process(int i,char[] str,List<String> retList){if (i == str.length){retList.add(String.valueOf(str));}for (int j = i; j < str.length;j++){swap(str,i,j);process(i + 1,str,retList);// 交换回来swap(str,i,j);}}public static void swap(char[] chars,int i,int j){char temp = chars[i];chars[i] = chars[j];chars[j] = temp;}
}

打印一个字符串的全部排列,要求不能出现重复的排列

public class StringPermutationTest {public static void main(String[] args) {List<String> strings = getAllSubPermutation("abc");for (String s : strings) {System.out.println(s);}}public static List<String> getAllSubPermutation(String str){List<String> subPermutationList = new ArrayList<>();if (str == null || str.length() == 0){return subPermutationList;}process(0,str.toCharArray(),subPermutationList);return subPermutationList;}/*** 当前来到的是 i 位置* str[0..i-1]是之前做的选择* @param i* @param str* @param retList*/public static void process(int i,char[] str,List<String> retList){if (i == str.length){retList.add(String.valueOf(str));}boolean[] bVisited = new boolean[26];for (int j = i; j < str.length;j++){//字符串没有被试过 才进行处理 if (!bVisited[str[j] - 'a']) {bVisited[str[j] - 'a'] = true;swap(str,i,j);process(i + 1,str,retList);// 交换回来swap(str,i,j);}}}public static void swap(char[] chars,int i,int j){char temp = chars[i];chars[i] = chars[j];chars[j] = temp;}
}

 


 

4 纸牌问题

 

给定一个整型数组arr,代表数值不同的纸牌排成一条线。玩家A和玩家B依次拿走每张纸牌,规定玩家A先拿,玩家B后拿,但是每个玩家每次只能拿走最左或最右的纸牌,玩家A和玩家B都绝顶聪明。请返回最后获胜者的分数

例如 :
arr=[1,2,100,4]。
开始时,玩家A只能拿走1或4。如果开始时玩家A拿走1,则排列变为[2,100,4],接下来玩家 B可以拿走2或4,然后继续轮到玩家A… 如果开始时玩家A拿走4,则排列变为[1,2,100],接下来玩家B可以拿走1或100,然后继续轮到玩家A… 玩家A作为绝顶聪明的人不会先拿4,因为拿4之后,玩家B将拿走100。所以玩家A会先拿1,
让排列变为[2,100,4],接下来玩家B不管怎么选,100都会被玩家 A拿走。玩家A会获胜,分数为101。所以返回101。

arr=[1,100,2]。
开始时,玩家A不管拿1还是2,玩家B作为绝顶聪明的人,都会把100拿走。玩家B会获胜,分数为100。所以返回100。

ooding

public class CardInLineTest {public static void main(String[] args) {int[] arr = {1,2,100,4};int iWinScore = win(arr);System.out.println(iWinScore);}/*** 先手函数* 在 L..R范围上先手拿牌 返回最大值* @param arr* @param L* @param R* @return*/public static int first(int[] arr, int L, int R) {// 如果只有一个数 直接拿走if (L == R) {return arr[L];}// 返回一个最大值return Math.max(arr[L] + second(arr, L + 1, R), // 先手拿走最左侧的数 后手在 (L + 1)..R范围上arr[R] + second(arr, L, R - 1)// 先手拿走最右侧的数 后手在 L..(R - 1)范围上);}/*** 后手函数** @param arr* @param L* @param R* @return*/public static int second(int[] arr, int L, int R) {// 因为是后手 L == R时 被别人拿走 因此直接返回if (L == R){return 0;}// 因为是别人决定的  因此会别人会把最小的留给自己return Math.min(first(arr,L + 1,R),// 别人拿走了L上 先手在 (L + 1)..R范围上first(arr,L,R -1));}public static int win(int[] arr){if (arr == null || arr.length == 0){return 0;}return Math.max(first(arr,0,arr.length - 1),second(arr,0,arr.length -1));}
}

 


 

5 逆序栈问题

 

给你一个栈,请你逆序这个栈,不能申请额外的数据结构,只能使用递归函数。
如何实现?

coding

public class ReverseStackNoRecurTest {public static void main(String[] args) {Stack<Integer> stack = new Stack<>();stack.push(3);stack.push(2);stack.push(1);reverseStack(stack);while (!stack.isEmpty()){System.out.println(stack.pop());}}/*** 反转栈* @param stack*/public static void reverseStack(Stack<Integer> stack){if (stack.isEmpty()){return;}// 每次调用都从栈中移除栈底元素int bottomEle = getBottomEle(stack);// 继续反转栈reverseStack(stack);stack.push(bottomEle);}/*** 从栈中移除栈底的元素* @param stack* @return*/public static int getBottomEle(Stack<Integer> stack){int ret = stack.pop();if (stack.isEmpty()){return ret;} else {int last = getBottomEle(stack);stack.push(ret);return last;}}
}

 


 

6 数字和字符串转换问题

 
规定1和A对应、2和B对应、3和C对应… 那么一个数字字符串比如"111",就可以转化为"AAA"、“KA"和"AK”。
给定一个只有数字字符组成的字符串str,返回有多少种转化结果

public class ConvertToLetterStringTest {public static void main(String[] args) {String str = "111";int count = convertToLetterString(str);System.out.println(count);}public static int convertToLetterString(String str){if (str == null || str.length() == 0){return 0;}return process(str.toCharArray(),0);}/*** [0..index-1]位置的字符已经做过决定* 当前来到 index位置* @param chr* @param index* @return*/public static int process(char[] chr,int index){if (index == chr.length){ //来到字符串的最后位置return 1;}if (chr[index] == '0') { // 出现 0 则无效 返回 0return 0;}if (chr[index] == '1'){int ret = process(chr,index + 1);// index 位置自己作为单独的部分 后续有多少种if (index + 1 < chr.length){ret += process(chr,index + 2);// (index 和 index + 1)作为单独的部分 后续有多少种}return ret;}if (chr[index] == '2'){int ret = process(chr,index + 1); //  index 位置自己作为单独的部分 后续有多少种if (index + 1 < chr.length && (chr[index + 1] <= '6' && chr[index] >= '0')) {ret += process(chr,index + 2);// (index 和 index + 1)作为单独的部分 后续有多少种}return ret;}// index位置的字符为 3..9的情况return process(chr,index + 1);}
}

 


 

7 背包问题

 

给定两个长度都为N的数组weightsvaluesweights[i]values[i]分别代表
i号物品的重量和价值。给定一个正数bag,表示一个载重bag的袋子,你装的物
品不能超过这个重量。返回你能装下最多的价值是多少?

coding

public class KnapsackQuesTest {/*** index... 之后的货物随意选择,形成的最大价值返回* 重量不能超过 bagWeight* @param weights index号货物的价值* @param values index 号货物的重量* @param index* @param alreadyWeight 之前做的决定 所达到的重量* @param bagWeight 背包载重* @return*/public static int process(int[] weights,int[] values,int index,int alreadyWeight,int bagWeight){if (alreadyWeight > bagWeight){return 0;}if (index == weights.length){return 0;}return Math.max(// 不要index位置的货物process(weights, values, index + 1, alreadyWeight, bagWeight),// 要index位置的货物values[index] + process(weights, values, index + 1, weights[index] + alreadyWeight,bagWeight));}
}

 


 

8 N皇后问题

 

N皇后问题是指在N*N的棋盘上要摆N个皇后,要求任何两个皇后不同行、不同列,也不在同一条斜线上。
给定一个整数n,返回n皇后的摆法有多少种。

n=1,返回1

n=232皇后和3皇后问题无论怎么摆都不行,返回0

n=8,返回92。

coding

public class NQueuesQues {public static void main(String[] args) {System.out.println(num(8));}/**** @param n 皇后的个数* @return*/public static int num(int n){if (n < 1){return 0;}int[] rec = new int[n]; // rec[index] index行的皇后放在了第几列return process(0,rec,n);}/**** @param index 当前来到的行* @param rec index 行放在了哪一列* @param n 行数* @return*/public static int process(int index,int[] rec,int n){if (index == n){ // 到最后一行的下一行  则说明之前有一种选择是正确的 找到了一种摆放的方法return 1;}int ret = 0;// 每一列进行尝试for (int col = 0; col < n;col++){if (isValid(rec,index,col)){// 有效 则将 index 行的皇后放在 col列rec[index] = col;//继续处理 下一行ret += process(index + 1,rec,n);}}return ret;}/***  判断 r 行的皇后 放在 c 列 是否有效 只需要判断 rec[0..r-1]即可* @param rec rec[]* @param r* @param c* @return*/public static boolean isValid(int[] rec,int r,int c){for (int k = 0; k < r;k++){// 共列if (rec[k] == c){return false;}// 共斜线// Math.abs(r - k) 竖直方向 r行到 k行的距离// rec[k] - c 水平方向 c行到 rec[k]列的距离if (Math.abs(r - k) == Math.abs(rec[k] - c)) {return false;}}return true;}
}

相关文章:

数据结构与算法--其他算法

数据结构与算法--其他算法 1 汉诺塔问题 2 字符串的全部子序列 3 字符串的全排列 4 纸牌问题 5 逆序栈问题 6 数字和字符串转换问题 7 背包问题 8 N皇后问题 暴力递归就是尝试 1&#xff0c;把问题转化为规模缩小了的同类问题的子问题 2&#xff0c;有明确的不需要继续…...

矩阵键盘行列扫描

/*----------------------------------------------- 内容&#xff1a;如计算器输入数据形式相同 从右至左 使用行列扫描方法 ------------------------------------------------*/ #include<reg52.h> //包含头文件&#xff0c;一般情况不需要改动&#xff0c;头文件包含…...

unity 实现拖动ui填空,并判断对错

参考&#xff1a;https://ask.csdn.net/questions/7971448 根据自己的需求修改为如下代码 使用过程中&#xff0c;出现拖动ui位置错误的情况&#xff0c;修改为使用 localPosition 但是吸附到指定位置却需要用的position public class DragAndDrop : MonoBehaviour, IBeginDr…...

《机器学习》第5章 神经网络

文章目录 5.1 神经元模型5.2 感知机与多层网络5.3 误差逆传播算法5.4 全局最小与局部最小5.5 其他常见神经网络RBF网络ART网络SOM网络级联相关网络Elman网络Boltzmann机 5.6 深度学习 5.1 神经元模型 神经网络是由具有适应性的简单单元组成的广泛并行互连的网络&#xff0c;它…...

FPGA project : flash_erasure

SPI是什么&#xff1a; SPI&#xff08;Serial Peripheral Interface&#xff0c;串行外围设备接口&#xff09;通讯协议&#xff0c;是Motorola公司提出的一种同步串行接口技术&#xff0c;是一种高速、全双工、同步通信总线&#xff0c;在芯片中只占用四根管脚用来控制及数据…...

AC修炼计划(AtCoder Regular Contest 166)

传送门&#xff1a;AtCoder Regular Contest 166 - AtCoder 一直修炼cf&#xff0c;觉得遇到了瓶颈了&#xff0c;所以想在atcode上寻求一些突破&#xff0c;今天本来想尝试vp AtCoder Regular Contest 166&#xff0c;但结局本不是很好&#xff0c;被卡了半天&#xff0c;止步…...

Android---Android 是如何通过 Activity 进行交互的

相信对于 Android 工程师来说&#xff0c;startActivity 就像初恋一般。要求低&#xff0c;见效快&#xff0c;是每一个菜鸟 Android 工程师迈向高级 Android 工程师的必经阶段。经过这么多年的发展&#xff0c;startActivity 在 google 的调教下已经变得愈发成熟&#xff0c;对…...

【论文解读】单目3D目标检测 MonoCon(AAAI2022)

本文分享单目3D目标检测&#xff0c;MonoCon模型的论文解读&#xff0c;了解它的设计思路&#xff0c;论文核心观点&#xff0c;模型结构&#xff0c;以及效果和性能。 目录 一、MonoCon简介 二、论文核心观点 三、模型框架 四、模型预测信息与3D框联系 五、损失函数 六、…...

Angular知识点系列(5)-每天10个小知识

目录 41. Angular的路由守卫42. 处理文件的上传和下载43. Angular的动画系统44. 使用第三方库和选择评估45. 性能优化46. AOT和JIT编译47. 处理响应式布局和适配不同屏幕尺寸48. Angular的国际化&#xff08;i18n&#xff09;49. Angular的PWA开发50. 使用Angular Material或其…...

基于海洋捕食者优化的BP神经网络(分类应用) - 附代码

基于海洋捕食者优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于海洋捕食者优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.海洋捕食者优化BP神经网络3.1 BP神经网络参数设置3.2 海洋捕食者算法应用 4…...

Lift, Splat, Shoot图像BEV安装与模型详解

1 前言 计算机视觉算法通常使用图像是作为输入并输出预测的结果,但是对结果所在的坐标系却并不关心,例如图像分类、图像分割、图像检测等任务中,输出的结果均在原始的图像坐标系中。因此这种范式不能很好的与自动驾驶契合。 在自动驾驶中,多个相机传感器的数据一起作为输…...

MySQL简介

数据库管理系统 1、关系型数据库管理系统: Oracle:Oracle是一种商业级关系型数据库管理系统,支持高可用性、高安全性以及广泛的企业级应用需求。SQL Server:SQL Server是Microsoft开发的企业级关系型数据库管理系统,广泛应用于Windows环境下的软件开发。MySQL:MySQL是一…...

php代码优化---本人的例子

直接上货&#xff1a; 1&#xff1a;数据统计 店铺数量、提现金额、收益金额、用户数量 旧&#xff1a; // //店铺// $storey db( store )->whereTime( addtime, yesterday )->count();//昨天// $stored db( store )->whereTime( addtime, d )->count();//今天…...

EMC Unity存储(VNXe) service Mode和Normal Mode的一些说明

本文介绍下EMC unity存储设备&#xff08;也包含VNXe存储设备&#xff09;的两种工作模式&#xff1a; Service mode&#xff1a;也叫做rescue mode&#xff0c;存储OS工作不正常或者有其他故障&#xff0c;就会进入这个模式&#xff0c;无法对外提供服务Normal mode&#xff…...

基于全景运动感知的飞行视觉脑关节神经网络全方位碰撞检测

https:/doi.org/10.1155/2023/5784720 摘要&#xff1a; 生物系统有大量的视觉运动检测神经元&#xff0c;其中一些神经元可以优先对特定的视觉区域做出反应。然而&#xff0c;关于如何使用它们来开发用于全向碰撞检测的神经网络模型&#xff0c;很少有人做过工作。为此&#…...

Java 继承与实现

一、继承&#xff08;extends&#xff09; 1.1 继承概念 继承是面向对象的基本特征&#xff0c;它允许子类继承父类的特征和行为&#xff0c;以提高代码的复用率和维护性等。下面一张图生动地展示了继承和类之间的关系&#xff1a; 继承图 上图中&#xff0c;“动物”、“食草…...

Unity 3D基础——计算两个物体之间的距离

1.在场景中新建两个 Cube 立方体&#xff0c;在 Scene 视图中将两个 Cude的位置错开。 2.新建 C# 脚本 Distance.cs&#xff08;写完记得保存&#xff09; using System.Collections; using System.Collections.Generic; using UnityEngine;public class Distance : MonoBehav…...

css常见问题处理

文章目录 1&#xff1a;禁止文字被复制粘贴1.1 Css 处理1.2 Js 处理 2&#xff1a;元素垂直水平居中2.1:方案一2.2 方案二2.3 方案三2.4 方案四2.5 方案五 1&#xff1a;禁止文字被复制粘贴 1.1 Css 处理 <div class"text">我不可以复制信息</div> <…...

蓝桥杯(迷宫,C++)

输入&#xff1a; 思路&#xff1a; 1、注意输入用字符串。 2、采用广度搜素的方法来求解。 3、因为最后要求字典序最小且D<L<R<U,所以在遍历四个方向的时候&#xff0c; 先向下&#xff0c;再向左、右&#xff0c;最后向上。 #include<iostream> #include…...

Python爬虫selenium安装谷歌驱动解决办法

驱动下载链接&#xff1a;CNPM Binaries Mirror (npmmirror.com) 谷歌浏览器老版本下载&#xff1a;Google Chrome 64bit Windows版_chrome浏览器,chrome插件,谷歌浏览器下载,谈笑有鸿儒 (chromedownloads.net) 驱动下载后解压缩直接放入python相应文件夹&#xff1a; 最后&a…...

为什么我放弃Python选择maxscript开发3dsMax插件?性能对比实测

为什么我放弃Python选择maxscript开发3dsMax插件&#xff1f;性能对比实测 当技术美术&#xff08;TA&#xff09;或开发者面临3dsMax插件开发的技术选型时&#xff0c;性能、开发效率和原生集成能力往往是核心考量因素。本文将基于实际测试数据&#xff0c;从执行速度、API调用…...

springboot+vue基于web的社区维修平台

目录同行可拿货,招校园代理 ,本人源头供货商功能模块划分技术实现要点扩展性设计项目技术支持源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作同行可拿货,招校园代理 ,本人源头供货商 功能模块划分 用户管理模块 注册与登录&#xff1a;支…...

NormalReconstructZ节点]原理解析与实际应用

的数据丢失问题&#xff0c;确保光照计算的准确性&#xff0c;是高质量实时渲染不可或缺的一环。该节点的设计充分考虑了现代图形硬件的特性&#xff0c;能够在保持高质量视觉效果的同时&#xff0c;显著降低内存带宽和存储空间的需求&#xff0c;特别适合移动平台和性能敏感的…...

OpenCore Legacy Patcher技术指南:让老旧Mac焕发新生的系统扩展方案

OpenCore Legacy Patcher技术指南&#xff1a;让老旧Mac焕发新生的系统扩展方案 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 当您的Mac设备因苹果官方停止…...

【深度验证】ArcGIS Band Collection Statistics相关性分析结果偏差的根源探究

1. 当GIS分析结果与统计软件不一致时 最近在做一个遥感数据分析项目时&#xff0c;我遇到了一个奇怪的现象&#xff1a;同样的数据集&#xff0c;在ArcGIS中使用Band Collection Statistics工具计算出的皮尔逊相关系数&#xff0c;与在Excel和R中计算的结果存在明显差异。起初我…...

Python实战:构建个人古诗知识库,从古诗文网高效采集与存储

1. 为什么你需要一个古诗知识库&#xff1f; 作为一个诗词爱好者&#xff0c;我经常遇到这样的困扰&#xff1a;读到一首好诗想收藏&#xff0c;结果过几天就忘了出处&#xff1b;想查找某个主题的诗句&#xff0c;却记不清具体内容&#xff1b;看到喜欢的诗人作品&#xff0c;…...

Dankoe新作《使命与收益》读书笔记 7|你不是迷茫,你只是不敢面对真正的自己

"我不知道自己想要什么。" 这大概是30岁前后最常说的一句话。辞职不敢&#xff0c;创业不会&#xff0c;留下来又不甘心。于是我们把迷茫当成一种身份&#xff0c;穿在身上&#xff0c;仿佛承认迷茫就不必为停滞负责。 但Dan Koe在《使命与收益》里说了一句扎心的话…...

赋能音乐自由:Unlock Music技术解密与全场景应用指南

赋能音乐自由&#xff1a;Unlock Music技术解密与全场景应用指南 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库&#xff1a; 1. https://github.com/unlock-music/unlock-music &#xff1b;2. https://git.unlock-music.dev/um/web 项目地址: https:…...

音乐标签编辑器:让本地音乐元数据管理效率提升90%的开源工具

音乐标签编辑器&#xff1a;让本地音乐元数据管理效率提升90%的开源工具 【免费下载链接】music-tag-web 音乐标签编辑器&#xff0c;可编辑本地音乐文件的元数据&#xff08;Editable local music file metadata.&#xff09; 项目地址: https://gitcode.com/gh_mirrors/mu/…...

LightRAG架构解析:从图索引到双层检索的工程实现

1. LightRAG架构概览&#xff1a;为什么需要双层检索&#xff1f; 在传统RAG系统中&#xff0c;我们常常遇到两个核心痛点&#xff1a;信息碎片化和上下文缺失。想象一下&#xff0c;当你问"电动汽车的普及对城市空气质量有何影响"时&#xff0c;传统系统可能分别检索…...