文章目录
- 背景
- 解决思路
- 代码实现
背景
已经呆在自己的舒适圈有很长一段时间了(公司快3年了,业务都熟的差不多了),决定开始改变(任何时候都不晚),尝试学习解决一些算法题,给自己一些适当的压力和不适感。希望能更好的提升自己的思考与编程能力。
这篇文章算是这个系列的第一篇,后续会不定期更新已经学习理解的算法题,可以期待一下。
另外,学习算法对程序员来说有很多好处。以下是一些主要的好处:
- 提高编程技能:学习算法可以帮助程序员更好地理解计算机科学的基础知识,从而提高编程技能。掌握算法可以帮助程序员更好地设计和实现高效的代码。
- 解决问题的能力:学习算法可以帮助程序员更好地解决问题。算法可以帮助程序员更好地理解问题,并提供一种系统的方法来解决问题。
- 提高职业发展:掌握算法可以帮助程序员在职业发展方面更上一层楼。许多公司都需要程序员具备算法和数据结构方面的知识,因此掌握这些技能可以帮助程序员在职业发展方面更有竞争力。
总之,学习算法对程序员来说是非常重要的。它可以帮助程序员提高编程技能、解决问题的能力,并在职业发展方面更上一层楼。
解决思路
- 一些基本的边界条件都是满足的,例如:左右位置不会超出数组长度,左位置不会大于有位置等。
- 求取这个数组的前缀和数组。假设原数组为 arr ,声明如下:
int[] arr = {1, 2, 3, 4, 5, 6};
那么数组 arr 对应的前缀和数组 prefix_sum_arr 为:
int[] prefix_sum_arr = {1, 3, 6, 10, 15, 21};
所以,数组 aar 的第 0 个位置到第 3 个位置之间的累加和为:prefix_sum_arr[3]
第 2 个位置到第 4 个位置之间的累加和为:prefix_sum_arr[4] - prefix_sum_arr[2-1]
任意位置之间的累加和依次类推,可以总结出规律。
代码实现
/**
* 求某个数组中任意两个位置之间的累加和
* 假设数据满足边界条件
*/
private void range2Sum(int[] arr, int left, int right) {
System.out.println(":> 原数组 " + Arrays.toString(arr));
// 求取前缀和数组 prefix_sum_arr
int len = arr.length;
int[] prefix_sum_arr = new int[len];
for (int i = 0;i < len;i++){
if (i == 0){
prefix_sum_arr[i] = arr[i];
}else {
prefix_sum_arr[i] = prefix_sum_arr[i - 1] + arr[i];
}
}
System.out.println(":> 前缀和数组 " + Arrays.toString(prefix_sum_arr));
// 求累加和
int result = (left == 0 ? prefix_sum_arr[right] : prefix_sum_arr[right] - prefix_sum_arr[left - 1]);
System.out.println(":> 左位置=" + left + ", 右位置=" + right);
System.out.println(":> 累加和为 " + result);
}
- 测试与输出:
int[] arr = {1, 2, 3, 4, 5, 6};
range2Sum(arr, 1, 4);
可以看到结果计算正确。
技术永不眠!下期有缘再见!