算法 常用思路

本文分享了多种算法解题策略,包括暴力法、寻找规律、双指针、动态规划等,适用于不同类型的编程问题,帮助提升解题效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文:https://blog.youkuaiyun.com/buyulian/article/details/77988006 
 

暴力法
对于一些简单的题或者是数值范围较小暴力不会时间超限的那种题。一般笔试时,若想不出 ac 的算法,能暴力通过一部分也是可以的。

 

从简单情况开始寻找规律
对于一个题,可以看下在简单情况下的数值,以寻求他的内在规律或者为破解复杂的情况提供线索。如登台阶的那个题,一次可以上 1 个或者上 2 个,问上 n 层有多少种方法。这个题当我们考虑 n=1,2,3,4 时的情况时就很容易发现这不就是斐波那契数列吗?

 

想想是否做过类似的问题
并尝试能否转化为我们所熟悉的类型。例如,其实有些题就是一个图论,就是隐藏的较深,我们转化一下或许就能拨开云雾见青天了。

 

从特殊情况开始分析
就是类比。例如,当我们解决一个二维三维情况下的题目时,我们可以从一维开始分析。

 

数组/链表定位

不要总循环考虑直接定位。比如当前位置的前边两位比较,A[i]>A[i-2],node>node.pre.pre,这样就减少循环遍历,要注意越界和空指针

 

常用的排序查找搜索算法和数据结构

从基本的常用排序查找算法切入。看有没有解决思路。

 

双指针

例如链表成环、链表倒数N元素、数组子串等问题。

 

滑动窗口

双指针的一种思路,解决子串问题。结合Map/二维数组等记录中间状态。

扩张:l-index向左 / r-index向右

收缩:l-index向右 / r-index向左

通过扩张/收缩确定子串位置。例如:从初始0位置开始、扩张r-index,满足指定条件后,收缩l-index向r-index靠拢。

例题解析:

https://leetcode-cn.com/problems/find-all-anagrams-in-a-string/solution/hua-dong-chuang-kou-tong-yong-si-xiang-jie-jue-zi-/

 

递归/回溯
递归在某些问题上会是问题思路更加清晰,其类似人脑思维(试探+退回),也会大大减少某些题的难度。特别适合于哪些 n =? 怎么样的问题。

 

分治(log)
分治主要是减少问题的规模,有效的减少用时,分治的主要难点在于合并两个子问题的结果。归并/快速排序、二分查找、二叉树、HashMap...都有分治思想。

 

二分(log)

二分不仅仅是有序性查找,也是一种临界值的好方法。找到点的其左边全部满足条件,右边都不满足条件,则此点临界值

 

动态规划
动态规划就是寻找最优子结构,并最大化减少递归计算中重复计算子问题的情况。用动态规划时,若一时没有思路,可以先暴力,然后寻找分析暴力中哪些子问题被重复计算了,对于发现的重复计算的问题,用动态规划的方式去消除它。

 

贪心算法
若一个题具有明显的贪心倾向,可以先用贪心算法试一下,能证明这个贪心算法是正确的最好,不能证明的话就尝试看能不能找一个反例,如果找不到反例就证明这个算法勉强能用。

 

位运算
对于一些没有太好思路的题,位运算或许能收获到意想不到的后果。

 

 

暴力打表寻找规律
就是用程序暴力例举出数值小时的情况,看看能不能发现什么规律。

 

分情况解决
我们不一定非得所有情况都用一种方式解决。不同的情况,若我们多加几个 if 能够使算法复杂度降低也是一个很好的方法。

 

从任意一个情况开始分析
若都没有太好的思路,先随便分析一种情况,或许分析着分析着思路就出来了。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值