交换算法:
用一个中间变量要把大的变小的 , ,小的变大的
这个中间变量相当于一个临时的空箱子,在交换当中这个空箱子特别重要
二分法查找:
在一次查找后
一定是确定了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 :