一些简单,入门的算法和解题技巧

交换算法:

     用一个中间变量要把大的变小的  , ,小的变大的

     这个中间变量相当于一个临时的空箱子,在交换当中这个空箱子特别重要

二分法查找:

     在一次查找后

     一定是确定了left=mid+1 ,right不动 或 left不动,right =mid-1}

辗转相取模法(我自己不叫辗转相除法是因为这里面根本没有除法):

      求最大公约数时ex a = 24 ; b =18

      令a%b=6;   在用b/6=0 (zhes);因此这个6就是最大公约数

      若余数不为零则一直会进行相除法.

     分析在whlie循环中,a表示新的除数(a=b是在给新除数赋值)

                                     b表示新的被除数(这里用了辗转除法的算法 )并且最大公约

                                     数放在b中 (因为b是被除数,一旦b被整除则除数与被除数是

                                                        倍数关系,即最大公约数就是b  )

注意 18%24=18

技巧:找倍数关系一般是用取模。

记忆:辗转相除法很像斐波那契数列,a是大的数(a要做除数理应大一些)

                                                         b是小的数(b要做被除数应该小一些)  

                                                         然后a = b , b = c , 又重新算一遍。

          注意:循环条件 c !=0  ,c = 0时 , a = b 所有就找到了最小共倍数

                    若不进入,a = b直接就是最小共倍数

杨氏矩阵查找算法:

对于这样一个特殊的数组,我想到的是一个二维的二分查找,但是时间复杂度O(NlogN)

我们用杨氏查找法

思想:不断用最右上角的那个值来和Key值比较,大于key则排除一行。

                                                                          小于key则排除一列。

在多个数组中元素个数始终相等的条件是好的的

     1.:若素组元素个数不相等则数组比较是进行不了的

优化算法:
    1:找重复运算项(一般能找到规律的)

 经典编程思想:

    在斐波那契数列中(迭代)

    有a+b→c  把a,b理解为固定的一个数是愚蠢的(因此很多情况会影响在运行中a,b,c的值的改变我们千万不能把它们当成固定的值了,这是新手很容易犯的错),要吧a当成第一个加数,把b当成第二个加数 并不断的给他们附上新值

       希望在以后的学习过程中多想起这个思想

字符串的三段翻转法:

       ex  要翻转一个字符串(abcdef)的2个字符,           

             第一步:分段 ,  要翻转两个字符就要以第二个字符为界限把他们

                                        分为两个字符串( ab  , cdef    )

             第二步:两个字符串分别翻转,得到(  ba ,  fedc    )

             第三步:整体翻转,得到(  cdefab  )

注意:  “分为并不是真正的分了”,只是为了好理解

3.两个数组的比较细节:

      数组比大小要看元素个数的

4.替罪羊:

面对一个会变的变量,但是我们后续还是要使用这个会变的变量的值时

  可以新建一个“替罪羊”去代替原变量进行变化

  ex:交换算法

5.让程序适应的情况的更多(也方面程序的调整 ):

      想要让一个程序,不止满足于一个变化,那么公式就要用定义了的变量去组成,

      不要用哪些毫不相干的数(有点硬凑的味道),

      用基本运算操作符进行一个小小的调整即可(加减乘除一个很小的数)

6.常见条件判断:

        在实际生活的问题之中,有很多潜在的条件,这一类题目通过反问自己的方法 来确保不 

        遗漏条件

        潜在的条件(以a举例):

                   {

                         a可以是负数吗?

                   a可以是奇数吗?

                   a可以是偶数吗?

                   这样子来反问自己

                    }

  

7.伪代码的技巧:

          伪代码:其不是真正的代码,其目标是描述算法梗概,避开细节,启迪思路

注意:在伪代码写出后,应该思考如何将其变为真正的代码。

{

    aadd实现的数组,只需要a*1100+b*11

}

    打破:对于生成数的固定遍历思维:

       在写这个题目时我有有一个逆天的思路:遍历4位的数字然后去判断aabb的数字,然后打

       印

8.解决溢出的方法:

         1.改类型,把小类型改为大类型:

               {

                            int n = 0;

                            Scanf("%d" , &n );

                            Long long n2 = n ;

               } 这个的一个技巧可以避免不常见的类型的输入与输出,

9.数组下标和实际冲突:

          直接从for循环上不管零下标即可(from,开灯问题)

10.真假的转化技巧:

        当一个动作只涉及真和假之间的转换的时候(如开灯问题,直接就是   arr【1】 

        =  !arr[1]  )。

11.第n行,输入n个元素

          解决方案:由改变判断条件解决( 把j<row ,改为 j< i)

         

       

12.笨方法(枚举法)

         这个方法适合写不出来的时候用

    

图形:

菱形公式:

    换个角度看问题,从空格入手

空格的作用:

     打印图形主要看的是每行多少个字符,确定字符的个数后。通过加减空格可以打出图

     形   ex:(菱形变成直角三角型,三角形变菱形)

图形的分析(对角线题目)(单元格分析法)
      1.规律

        右斜对角线的是是i+j的规律

        而左斜对角线是i+j= n-1 (固定的一个数)(n为你需要输入的规模)

    

冒泡排序

   核心:让两两相邻的元素相比较,然后决定是否进行交换

   作用:每一趟运行后就会把你想要的元素排到最后去

   解题:

       第一步:确定趟数:每一趟会搞定一个元素,but最后一趟会一起搞定两个元素

          所以n个元素要搞n-1趟

       第二步:.确定当前趟次要交换几次:相邻的进行交换以此递推(定好的元素就不要进行交换了)

注意:

         冒泡排序用来排大小顺序(还是可以的毕竟规则统一)

         但是要排序某一个特定的数还是有风险(如果遇上两个特定数不发生交换就废

         了)  ex :

                      

         

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值