Arrays 如何从暴力算法转向智能算法?
当我解决问题时,我总是使用蛮力来解决总是给出时间限制问题的算法。 我真的不知道该怎么办? 如何将我的方法从暴力算法改为智能算法 例如,我在hackerrank上解决这个问题: 考虑一个整数数组,我们定义两个元素之间的绝对差,和(其中)为的绝对值 给定一个整数数组,查找并打印数组中任意两个元素之间的最小绝对差 输入格式 第一行包含一个表示(整数数)的整数。 第二行包含空格分隔的整数,用于描述的各个值 约束条件Arrays 如何从暴力算法转向智能算法?,arrays,algorithm,brute-force,greedy,divide-and-conquer,Arrays,Algorithm,Brute Force,Greedy,Divide And Conquer,当我解决问题时,我总是使用蛮力来解决总是给出时间限制问题的算法。 我真的不知道该怎么办? 如何将我的方法从暴力算法改为智能算法 例如,我在hackerrank上解决这个问题: 考虑一个整数数组,我们定义两个元素之间的绝对差,和(其中)为的绝对值 给定一个整数数组,查找并打印数组中任意两个元素之间的最小绝对差 输入格式 第一行包含一个表示(整数数)的整数。 第二行包含空格分隔的整数,用于描述的各个值 约束条件 2<n<2^5 10^-9<ai<10^9 样本输出 3 我
2<n<2^5
10^-9<ai<10^9
样本输出
3
我的方法是用每个元素减去每个元素并打印最小差值,但它给出了时间限制问题
Arrays.sort(arr);
int minDiff = arr[n - 1] - arr[0];
for (int i = 0; i < n - 1; i++) {
int tmpDiff = arr[i + 1] - arr[i];
if (tmpDiff < minDiff) {
minDiff = tmpDiff;
}
}
Arrays.sort(arr);
int minDiff=arr[n-1]-arr[0];
对于(int i=0;i
arr[i]
,直接较小的元素和较大的元素将分别位于左侧(i-1
th位置)和右侧(i+1
th位置)。除了arr[i-1]之外,不可能获得更小的绝对差
或arr[i+1]
(为什么?)
这是一个简单的贪心问题。你必须多练习才能想出解决这个问题的方法。想出任何方法后,试着用矛盾证明、归纳证明来验证正确性。祝你好运
编辑
排序将花费O(nlogn)
和一些字符串比较开销。而迭代查找差异将花费O(n)
。因此总体时间复杂度将是O(nlogn)
您的想法将采用
O(n^2)
,这要慢得多,因为您要将每个元素与每个元素进行比较。蛮力意味着您需要执行所有可能的解决方案,以验证您的问题是否得到解决
为了避免使用暴力,您需要找到一种方法来减少可能的解决方案集,以减少可尝试的解决方案。很难帮助当您没有正确复制问题或在互动程序中显示您对问题的任何尝试时,不幸的是,没有通用的receipe。您必须“聪明”“。你可以通过学习算法和数据结构来获得一些经验。@cricket_007我已经正确地复制了这句话不完整。。。“我们定义两个元素之间的绝对差,和(其中)为的绝对值。”排序数组是另一个需要时间的操作,因此排序+查找最小差不会比我的代码花费更多时间吗?@AaqibSoomro检查更新。我已经接受了这个想法。
Arrays.sort(arr);
int minDiff = arr[n - 1] - arr[0];
for (int i = 0; i < n - 1; i++) {
int tmpDiff = arr[i + 1] - arr[i];
if (tmpDiff < minDiff) {
minDiff = tmpDiff;
}
}