引言
在编程学习和算法训练中,我们经常会遇到各种经典的数学问题和几何计算题目。本文将深入解析四个不同类型的算法题目,涵盖杨辉三角的生成、数组操作游戏以及几何查询问题,帮助读者掌握这些经典算法的实现思路和编程技巧。
第一部分:杨辉三角的生成与特性
题目描述
杨辉三角是中国古代数学的杰出成就之一,每个数是它左上方和右上方的数的和。给定一个非负整数 numRows,我们需要生成杨辉三角的前 numRows 行。
算法实现
class Solution {
public List<List<Integer>> generate(int numRows) {
List<List<Integer>> ret = new ArrayList<List<Integer>>();
for (int i = 0; i < numRows; ++i) {
List<Integer> row = new ArrayList<Integer>();
for (int j = 0; j <= i; ++j) {
if (j == 0 || j == i) {
row.add(1);
} else {
row.add(ret.get(i - 1).get(j - 1) + ret.get(i - 1).get(j));
}
}
ret.add(row);
}
return ret;
}
}
算法解析
- 边界处理:每行的第一个和最后一个元素都是1
- 递推关系:中间元素等于上一行相邻两个元素之和
- 时间复杂度:O(n²),其中n为行数
- 空间复杂度:O(n²),存储整个三角形
示例分析
当 numRows = 5 时,输出为:

第二部分:杨辉三角的特定行获取
题目描述
给定一个非负索引 rowIndex,返回杨辉三角的第 rowIndex 行。这里要求优化空间复杂度,只返回特定行而非整个三角形。
优化实现
class Solution {
public List<Integer> getRow(int rowIndex) {
List<Integer> row = new ArrayList<Integer>();
row.add(1);
for (int i = 1; i <= rowIndex; ++i) {
row.add(0);
for (int j = i; j > 0; --j) {
row.set(j, row.get(j) + row.get(j - 1));
}
}
return row;
}
}
优化技巧
- 滚动数组:只维护当前行,从后往前更新避免覆盖
- 数学公式:利用组合数公式 C(n,k) = C(n,k-1) × (n-k+1)/k
- 空间优化:从O(n²)优化到O(n)
第三部分:数组操作游戏
游戏规则
这是一个有趣的数组操作游戏:
- 初始有一个长度为偶数的整数数组 nums 和一个空数组 arr
- 每轮Alice先移除最小元素,然后Bob移除次小元素
- Bob先将他的元素加入arr,然后Alice加入她的元素
- 重复直到nums为空
算法实现
class Solution {
public int[] numberGame(int[] nums) {
Arrays.sort(nums);
for (int i = 0; i < nums.length; i += 2) {
int tmp = nums[i];
nums[i] = nums[i + 1];
nums[i + 1] = tmp;
}
return nums;
}
}
算法思路
- 排序预处理:先将数组排序,便于按顺序取最小元素
- 元素交换:每两个元素为一组,交换位置实现Bob先添加的规则
- 时间复杂度:O(n log n),主要由排序决定
示例演示
输入:nums = [5,4,2,3]
- 排序后:[2,3,4,5]
- 分组交换:[3,2,5,4]
- 输出:[3,2,5,4]
第四部分:几何查询问题
问题描述
给定多个二维平面点和多个圆形查询,对于每个圆形查询,统计落在圆内(包括边界)的点的数量。
数学原理
判断点是否在圆内的数学公式:
[ (x_p - x_c)^2 + (y_p - y_c)^2 \leq r^2 ]
其中:
- ((x_c, y_c)) 是圆心坐标
- (r) 是圆的半径
- ((x_p, y_p)) 是点的坐标
算法实现
class Solution {
public int[] countPoints(int[][] points, int[][] queries) {
int m = points.length, n = queries.length;
int[] ans = new int[n];
for (int i = 0; i < n; ++i) {
int cx = queries[i][0], cy = queries[i][1], cr = queries[i][2];
for (int j = 0; j < m; ++j) {
int px = points[j][0], py = points[j][1];
int dx = cx - px, dy = cy - py;
if (dx * dx + dy * dy <= cr * cr) {
++ans[i];
}
}
}
return ans;
}
}
性能分析
- 暴力解法:对于每个查询检查所有点
- 时间复杂度:O(m × n),其中m是点数,n是查询数
- 优化思路:
- 使用空间划分数据结构(如KD树)
- 预处理点集,按区域划分
- 对于大规模数据可考虑并行计算
实际应用场景
这种几何查询在现实生活中有广泛应用:
- 地理位置服务:查找某个区域内的所有商家
- 游戏开发:检测物体是否在攻击范围内
- 计算机图形学:点云数据处理
- 物联网:传感器网络覆盖分析
算法思维拓展
1. 分治思想
在杨辉三角问题中,我们利用了问题的递归结构;在几何查询中,可以考虑使用分治策略优化查询效率。
2. 空间换时间
对于频繁的几何查询,可以预处理点集,建立空间索引结构,显著提高查询效率。
3. 数学优化
利用数学性质优化计算,如避免开方运算,直接比较平方值。
总结
本文通过四个不同类型的算法问题,展示了从基础数学问题到实际应用的完整解题思路:
- 杨辉三角生成 - 理解递归结构和动态规划思想
- 特定行获取 - 掌握空间优化技巧
- 数组游戏 - 学习问题建模和规则转化
- 几何查询 - 应用数学知识解决实际问题
这些题目不仅锻炼了编程能力,更重要的是培养了将实际问题抽象为数学模型,再转化为高效算法的思维能力。建议读者在理解这些解法的基础上,尝试自己实现并思考可能的优化方案,真正掌握算法设计的精髓。
四大算法实战解析
1290

被折叠的 条评论
为什么被折叠?



