算法基础六

C语言——搜索算法求解数独(DFS) 深度优先求解数独 阅读详情

搜索插入位置

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

示例 1: 输入: nums = [1,3,5,6], target = 5 输出: 2
示例 2: 输入: nums = [1,3,5,6], target = 2 输出: 1
示例 3: 输入: nums = [1,3,5,6], target = 7 输出: 4

解题思路:二分搜索


    public int searchInsert(int[] nums, int target) {
        int len = nums.length;
        // 因为数组是升序的,判断最后一个元素与要插入的元素大小
        if (nums[len - 1] < target) {
            return len;
        }

        int left = 0;
        int right = len - 1;
        // 在区间 nums[left..right] 里查找第 1 个大于等于 target 的元素的下标
        while (left < right) {
            // 从中间开始分
            int mid = (left + right) / 2;
            if (nums[mid] < target){
                // 下一轮搜索的区间是 [mid + 1..right]
                left = mid + 1;
            } else {
                // 下一轮搜索的区间是 [left..mid]
                right = mid;
            }
        }
        return left;
    }

有效数独

请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。
数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。
在这里插入图片描述


 public boolean isValidSudoku(char[][] board) {
        Map<Integer, Set<Integer>> row  = new HashMap<>();
        Map<Integer, Set<Integer>> col = new HashMap<>();
        Map<Integer, Set<Integer>> area = new HashMap<>();

        for(int i = 0; i < 9; i++) {
            row.put(i, new HashSet<>());
            col.put(i, new HashSet<>());
            area.put(i, new HashSet<>());
        }

        for(int i = 0; i < 9; i++) {
            for(int j = 0; j < 9; j++) {
                char c = board[i][j];
                if (c == '.') {
                    continue;
                }
                int u = c - '0';
                int idx = i / 3 * 3 + j / 3;
                if(row.get(i).contains(u) || col.get(j).contains(u) || area.get(idx).contains(u)) {
                    return false;
                }
                row.get(i).add(u);
                col.get(j).add(u);
                area.get(idx).add(u);
            }
        }
        return true;
    }

解数独

编写一个程序,通过填充空格来解决数独问题。
数独的解法需 遵循如下规则:
数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。

解题思路:回溯算法。


    private boolean[][] line = new boolean[9][9];
    private boolean[][] column = new boolean[9][9];
    private boolean[][][] block = new boolean[3][3][9];
    private boolean valid = false;
    private List<int[]> spaces = new ArrayList<int[]>();

    public void solveSudoku(char[][] board) {
        for(int i = 0; i < 9; ++i) {
            for(int j = 0; j < 9; ++j) {
                if(board[i][j] == '.') {
                    spaces.add(new int[]{i, j});
                } else {
                    int digit = board[i][j] - '0' - 1;
                    line[i][digit] = column[j][digit] = block[i / 3][j / 3][digit] = true;
                }
            }
        }

        dfs(board, 0);
    }

    public void dfs(char[][] board, int pos) {
        if (pos == spaces.size()) {
            valid = true;
            return;
        }

        int [] space = spaces.get(pos);
        int i = space[0];
        int j = space[1];
        for(int digit = 0; digit < 9 && !valid; ++digit) {
            if(!line[i][digit] && !column[j][digit] && !block[i / 3][j / 3][digit]) {
                line[i][digit] = column[j][digit] = block[i / 3][j / 3][digit] = true;
                board[i][j] = (char) (digit + '0' + 1);
                dfs(board, pos + 1);
                line[i][digit] = column[j][digit] = block[i / 3][j / 3][digit] = false;
            }
        }
    }

组合总和

给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。
candidates 中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。

示例 1:
输入:candidates = [2,3,6,7], target = 7 输出:[[2,2,3],[7]] 解释: 2 和 3
可以形成一组候选,2 + 2 + 3 = 7 。注意 2 可以使用多次。 7 也是一个候选, 7 = 7 。 仅有这两种组合。
示例 2:
输入: candidates = [2,3,5], target = 8 输出: [[2,2,2,2],[2,3,3],[3,5]]
示例3:
输入: candidates = [2], target = 1 输出: []


  public List<List<Integer>> combinationSum(int[] candidates, int target) {
        int len = candidates.length;
        List<List<Integer>> res = new ArrayList<>();
        if (len == 0) {
            return res;
        }

        Deque<Integer> path = new ArrayDeque<>();
        dfs(candidates, 0, len, target, path, res);
        return res;
    }

    /**
     * @param candidates 候选数组
     * @param begin      搜索起点
     * @param len        冗余变量,是 candidates 里的属性,可以不传
     * @param target     每减去一个元素,目标值变小
     * @param path       从根结点到叶子结点的路径,是一个栈
     * @param res        结果集列表
     */
    private void dfs(int[] candidates, int begin, int len, int target, Deque<Integer> path, List<List<Integer>> res) {
        // target 为负数和 0 的时候不再产生新的孩子结点
        if (target < 0) {
            return;
        }
        if (target == 0) {
            res.add(new ArrayList<>(path));
            return;
        }

        // 重点理解这里从 begin 开始搜索的语意
        for (int i = begin; i < len; i++) {
            path.addLast(candidates[i]);
            // 注意:由于每一个元素可以重复使用,下一轮搜索的起点依然是 i,这里非常容易弄错
            dfs(candidates, i, len, target - candidates[i], path, res);

            // 状态重置
            path.removeLast();
        }
    }

组合总和2

给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的每个数字在每个组合中只能使用 一次 。注意:解集不能包含重复的组合。

示例 1:
输入: candidates = [10,1,2,7,6,1,5], target = 8, 输出: [ [1,1,6], [1,2,5],[1,7], [2,6] ]
示例 2:
输入: candidates = [2,5,2,1,2], target = 5, 输出: [ [1,2,2], [5] ]


   
    List<int[]> freq = new ArrayList<int[]>();
    List<List<Integer>> ans = new ArrayList<List<Integer>>();
    List<Integer> sequence = new ArrayList<Integer>();

    public List<List<Integer>> combinationSum2(int[] candidates, int target) {
        Arrays.sort(candidates);
        for (int num : candidates) {
            int size = freq.size();
            if (freq.isEmpty() || num != freq.get(size - 1)[0]) {
                freq.add(new int[]{num, 1});
            } else {
                ++freq.get(size - 1)[1];
            }
        }
        dfs(0, target);
        return ans;
    }

    public void dfs(int pos, int rest) {
        if (rest == 0) {
            ans.add(new ArrayList<Integer>(sequence));
            return;
        }
        if (pos == freq.size() || rest < freq.get(pos)[0]) {
            return;
        }

        dfs(pos + 1, rest);

        int most = Math.min(rest / freq.get(pos)[0], freq.get(pos)[1]);
        for (int i = 1; i <= most; ++i) {
            sequence.add(freq.get(pos)[0]);
            dfs(pos + 1, rest - i * freq.get(pos)[0]);
        }
        for (int i = 1; i <= most; ++i) {
            sequence.remove(sequence.size() - 1);
        }
    }

启发式搜索算法解决数独问题sudoku,附python实现 定义 数独是源自18世纪瑞士的一种数学游戏。是一种运用纸、笔进行演算的逻辑游戏。玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个粗线宫(3*3)内的数字均含1-9,不重复 。 数独盘面是个九宫,每一宫又分为九个小格。在这八十一格中给出一定的已知数字和解题条件,利用逻辑和推理,在其他的空格上填入1-9的数字。使1-9每个数字在每一行、每一列和每一宫中都只出现一次,所以又称“九宫格”。 算法思想 启发式搜索算法,针对摒弃法的改进。 先算出所有空格的候选数,然后找到候选数 阅读详情

相关推荐

基础算法篇(六),基于AC框架的PPO算法

我们上一章给大家介绍了经典的策略梯度(PG)算法,但这个经典算法存在两个问题: 一是需要完整序列 我们根据强化学习的目标“最大化总收益”而得到的公式中包含R(τ)=∑t=1TrtR\left(\tau\right)=\sum_{t=1}^Tr_tR(τ)=∑t=1T​rt​,就算我们对其进行添加基线、改变收益计算方式等,都还是没有脱离从ttt时刻起,需要后续所有收益这一问题,这一方法类似于我们在“基础算法篇(二),蒙特卡洛方法解决Model-Free强化学习问题”讲的方法,而这对强化学习本身来说,是很难

samurasun的博客 7876

深度搜索----深度搜索解决数独问题

深度搜索----深度搜索解决数独问题 1.深度优先搜索(DFS) 从某个状态开始,不断的转移状态直到无法转移,然后回退到前一步的状态,继续转移到其他状态,如此不断重复,直到找到最终的解。 2.数独问题 给定数列a,判断是否可以从中选出若干个数,使他们的和恰好为k。 输入: n=4 a={1,2,4,7} k=13 输出: Yes 3.数独问题分析与实现 由于数列中每个数存在加或者不加两种状态,那么可绘制二叉状态树如下: 算法实现: public class AlgorithmCenter200713

浪舟子的博客 1699

MATLAB基础(六)评价类算法

•常见的综合评定方法分为两类: •(1)综合评定法:直接评分法(专家打分综合法)、总分法、加权综合评定法、AHP+模糊综合评判、模糊神经网络评价法、待定系数法及分类法. •现代综合评价方法:层次分析法(Analytic Hierarchy Process,AHP)、数据包络分析法(Data Envelopment Analysis,DEA)、人工神经网络评价法(Artificial Neura...

少年程序郎 1万+

9*9数独问题——深度搜索算法

转自:http://blog.youkuaiyun.com/qq_31558353/article/details/50615760 作者原来的程序有问题,会改变到已有的数值。我在原有的基础上加了book标记,修改后验证OK。 数独是经典的逻辑问题,也可以使用DFS算法求解,下面短短几十行代码,就解决了数独的问题。 计算机真是个好东西啊! #include "pch.h" #include&lt;s...

fyydhsw的专栏 5517

算法基础练习(六)

本文摘要:优快云编程竞赛六十二期包含四个算法题解:1)计算两个轴对齐矩形的覆盖总面积,通过判断相交情况处理重叠面积;2)机器猫移动模拟,检测指令执行过程中是否遇到障碍物;3)寻找给定时间前后最近的回文时间;4)解决分配问题(孔融让梨)和组合问题(小熊吃水果)。第五题采用动态规划生成丑数序列,使用三指针法高效计算第n个丑数。所有题解均提供完整C++代码实现,涵盖几何计算、模拟、字符串处理和数学算法等多种编程技巧。

qq_73044452的博客 504

深搜算法解数独

用深搜(深度优先搜索-DFS)算法解数独。通过解数独这一实例,相信能让初学者更直观地理解深搜的功能和实现。

基础算法(六):回溯算法

Hello大家好,停了半个多月算法学习的荔枝又变菜了,最近决定认认真真地重新学习回溯,在这篇文章中,荔枝也准备仔仔细细梳理相关的问题和知识点,主要通过回溯算法的模板题解来类比回溯算法五大问题:组合、分割、子集、排列和棋盘问题

荔枝当大佬的博客 2836

保姆级教程:用SAP PS管理电梯/大型设备项目(ETO/ATO模式)从成本收集到开票结算

本文详细解析了SAP PS模块在ETO/ATO项目中的全流程成本管理实践,特别针对电梯/大型设备制造行业。从成本收集到开票结算,通过WBS元素、网络活动等核心架构设计,结合F-02、CJ20N等事务代码,实现设计、生产、物流及现场服务各阶段的精准成本控制,助力企业提升项目利润率与财务效率。

weixin_30444105的博客 457

六、基础算法——双指针算法

双指针算法

靡不有初 鲜克有终 250

射频工程师必须了解的S参数四项要点

本文围绕单端 6 英寸走线的 S 参数展开深入分析,核心包含四项关键要点:低频下导线电学长度远小于信号波长,S11 呈大负分贝值、S21 接近 0 分贝;端口与走线的阻抗不匹配引发反射叠加,形成 S11 首个峰值(对应传输线四分之一波长频率);S21 相位可作为一致性检查依据,其 90° 相位差与 S11 峰值吻合;理想建模中 S11 峰值随频率上升因损耗下降,实际测量因连接器等阻抗不连续性,S11 会出现振荡上升。分析依托 Keysight ADS 工具与电磁求解器原理,为 S 参数解读提供科学支撑。

一只豌豆象的博客 1284

【Java微服务-医疗管理项目】(附源码+资料+教程)

尚医疗是专门为各大医院、门诊提供的一款医疗管理平台。 系统包含:系统管理、药品进销存管理、看病就诊、收费管理、检查管理、数据统计等核心模块。 通过尚医疗系统可以快速、方便的管理病人从挂号到门诊结束所涉及到的全套流程。也可以清晰明了的体现出药品进货、出售的所有记录。.........

m0_72882572的博客 2203

算法基础六:快速排序

提到排序算法,多数人最先想到的就是快速排序算法。快速排序算法是在基础上设计出来的一种排序算法,和其它排序算法相比,快速排序算法具有效率高、耗费资源少、容易实现等优点。

weixin_72011965的博客 1308

保姆级教程:用GATK4分析重测序数据,从fq.gz到vcf文件一步不落

本文提供了一份详细的GATK4重测序数据分析教程,涵盖从原始fq.gz文件到最终vcf文件的完整上游分析流程。通过Miniconda环境配置、数据质控、序列比对、变异检测等步骤的逐步指导,帮助生物信息学研究人员掌握标准流程,特别适合Linux命令行基础薄弱的研究者学习实践。

weixin_28366053的博客 473

六、数据结构与算法基础

数据结构和算法基础

写写随便! 481

因果推断(二):因果推断涉及的ITE、ATE、CATE等效应

因果效应也称为**处理效应(Treatment effect)**是用于评判干预与否的结果差异的指标(处理变量对结果变量的影响)。比如在接受治疗组中,如果这些人不接受治疗,这组人接受治疗和不接受治疗的效应差异是多少。定义为实验组中每个个体的处理效应差异,比如一个个体在接收治疗和不接受治疗的两个处理方式的健康程度得分的差。但是一个人因为不可能。比如我们想探究接受治疗的男性用户和不接受治疗的男性用户的平均效果差异就是CATE。前面说ITE是无法观测的,是因为一个人不能同时接受治疗又不接受治疗,这里关键的就是。

Y1n的博客 3713

红米K70至尊版修复“nv损坏”主板电阻图示 mtk芯片工程固件刷写与步骤说明

💝💝💝红米K70至尊版 机型代码:rothko,搭载天玑9300+旗舰芯片.后置5000万像素索尼IMX906高动态OIS主摄,800万像素超广角镜头,200万像素微距镜头,前置2000万像素摄像头,也适用于以下型号的小米机型:2407FPN8EG,2407FPN8ER,XIG06,A402XM,2407FRK8EC。 💝💝💝通过博文了解 1💝💝💝-----此机型工程固件的资源刷写注意事项 2💝💝💝-----此机型刷写工程固件预览界面 3💝💝💝------红米K

小马哥的专栏 1458

左神基础算法笔记-六

1. 图的表达、存储和生成方式图分为有向图和无向图,无向图可以用有向图来表示。 邻接表 上图用邻接表表示如下: 1:2 2:3,4 3:4 4:null 如果上图为无向图,则邻接表表示如下: 1:2 2:1,3,4 3:2,4 4:2,3 邻接矩阵 上图用邻接矩阵表示如下: 1:(2,7),(3,5) 2:(3,2) 3:null 图中点的存...

一盏小灯下 341

torch.nn.rnn实现循环神经网络

------------------------------------nn.rnn模型实现。#------------------------------------模型实现。#-----------------------------------训练模型。#-----------------------------------训练模型。#--------------------------------读取数据。实现循环神经网络,并在至少一个数据集上进行实验,从训练时间、预测精度、...

matlab_python22的博客 2971

算法基础篇:(六)基础算法之双指针 —— 从暴力到高效的优化艺术

本文详细介绍了双指针算法的原理与应用。双指针通过巧妙维护两个指针(同向或反向),将暴力解法的O(n²)时间复杂度优化为O(n),是解决数组/字符串问题的有力工具。文章从核心定义、适用条件、类型分类入手,重点讲解了同向双指针(滑动窗口)的通用模板"进窗口-判条件-出窗口-更结果",并通过4个典型例题(最长无重复子数组、最短包含所有元素子数组等)进行实战解析。同时指出了常见误区,如指针回退、数据结构选择不当等。双指针还可应用于两数之和、链表问题等场景,体现了优化遍历逻辑的核心思想。

2301_79248256的博客 1847

HLA分型

HLA分型 一、根据WES的tumor数据进行数据分型 选用hlahd 软件安装及使用 [root@18605fd8771e ~]# wget https://jaist.dl.sourceforge.net/project/bowtie-bio/bowtie2/2.4.1/bowtie2-2.4.1-linux-x86_64.zip [root@18605fd8771e ~]# unzip bowtie2-2.4.1-linux-x86_64.zip && mv bowtie2-2.4.1

qq_23435961的博客 2487

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

六、基础算法 -- 超快速排序

超快速排序 -- 归并排序

是芜湖的,更是世界的! 4645

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

算法设计与分析基础(六)

算法设计与分析基础(六) 练习题 练习一 对 f(n)=n, 并且 a = b 的情况,证明递归方程T(n)=aT(n/b)+f(n)的解为O(nlogn). 证明: 练习二 设计求解n个数字之和的分治算法,给出伪代码描述并分析算法的计算复杂度(每次分为2个子问题)。 算法思想:将n个待相加的元素分割成2个大致相等的子集合A、B;对每一个子集合分别递归求和;再将每个子集的和相加。当n等于1时递归终止,此时所求之和为该元素自身。 伪代码: Algorithm Sum (A[0 ... n-

BKSW.的博客 1961

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

基础算法(六)——双指针算法

两个指针指向两个不同序列,用两个指针维护某一种逻辑,例如归并排序两个指针指向一个序列,即用两个指针维护一段区间,例如快排。

code_bro的博客 460

【Python 算法零基础 2.模拟 ⑥ 算法技巧】

由于 num1 < num2 ,num2 减 num1 得到 num1 = 2 ,num2 = 3 - 2 = 1。由于 num1 == num2 ,num1 减 num2 得到 num1 = 10 - 10 = 0。- 操作 3 :num1 = 1 ,num2 = 1。由于 num1 == num2 ,num1 减 num2。- 操作 2 :num1 = 2 ,num2 = 1。- 第 1 秒,内存条 2 被占用 1 位内存,内存条 2 现在有 10 位剩余可用内存。

m0_73983707的博客 1015

算法基础例六堆排序

堆排序        堆排序涉及到数据结构中的内容,但也是各种笔试面试常考的,所以有必要做一下笔记来记录一下。堆排是将一个数组想象成一个完全二叉树,完全二叉树是由满二叉树或者从左往右依次补齐的二叉树组成。        已知完全二叉树的一个节点下标为i 则它的左子节点下标为2*i+1 它的右子节点为下标为2*i+2,...

awujiang的博客 275

[Acwing] 算法基础课总结 六 贪心

目录区间问题1.区间选点 区间问题 1.区间选点 题意 : 给定多个区间,找到最少的点,使得每个区间至少包含一个点 思路 : 按照右端点排序,然后找L[i−1]<R[i]L[i-1]<R[i]L[i−1]<R[i],并且更新当前的右端点 void solve(){ int n;cin>>n; vector<pii> v; for(int i=1;i<=n;i++){ int l,r;cin>>l>>r; v.pb(

qq_34364611的博客 232
上一篇: 4、Schema与数据类型优化
下一篇: 算法基础七
geek-wmy
博客等级 码龄9年 322粉丝 126原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值