数据结构进阶实训八 数组,规律
Data structure advanced training course notes and algorithm exercises
Source Code: https://github.com/MysticalGuest/DataStructure/tree/master/AdvancedJuniorTraining
题目1
1 | 荷兰国旗 |
1.1 算法设计思想
把题目理解为这样的问题:
一个循环,把红色球和剩余的球交换,那么红球就排序好了,就是两两交换问题;
另一个循环,把剩下没排序好的白球和蓝球也排序好,也是两两交换;
程序的时间复杂度取决于长度取决于第一个循环,O(n)
1.2 源代码
1 |
|
1.3 运行情况截图
题目2
1 | 完美洗牌算法 |
2.1 算法设计思想
依次考察每个位置的变化规律
a1: 0 -> 不变
a2: 1 -> 2
a3: 2 -> 4
a4: 3 -> 6
…
an: n-1 -> 2n-2
b1: n -> 1
b2: n+1 -> 3
b3: n+2 -> 5
…
bn-1: 2n-2 -> 2n-3
bn: 2n-1 -> 不变
可以得出下标的变化规律:
j=(i * 2) % (n2 -1)
所以将值赋给辅助数组即可
2.2 源代码
1 | void perfect_shuffle(char *a[],int n) { |
2.3 运行情况截图
题目3
1 | 买票找零问题 |
3.1 算法设计思想
找规律递推的方法;
要求持50元n人,100元n人,多少种排队方式,那么排在最后的一定是持100元的人,所以和持50元n人,100元n-1人的排队方式相同;
发现规律,持50元n-1人,100元n-1人和持50元n-1人,100元n-2人的排队方式相同;
所以这就可以从最小的1开始求了,然后累加到n,得到最后结果
3.2 源代码
1 |
|
3.3 运行情况截图