力扣解题之暴力解题法(JavaScript)
什么是暴力解题法
暴力解题法:根据问题的描述和所涉及的概念,简单直接的解决问题的方法。
暴力解题法是可以用来解决广阔领域的各种问题,它也可能也是唯一一种几乎什么问题都能解决的一般性方法。在输入数据的规模并不巨大的情况下,我们可以使用暴力法来解决一些问题。
比如在排序算法中:冒泡排序和选择排序就是两个很好的例子,它们就是从直观上出发,根据排序的定义做出的直观算法。
但是,暴力破解法对计算机资源耗费严重,如果条件太复杂,运算速度缓慢,为了解决这一问题,我们可以事先把与之不相关的条件进行限制,减少计算机的运算量。
力扣-75、颜色分类(难度-中等)
题目描述
给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sort-colors
解题思路
通过题目可以得出题目中只有三种数分别是“0”、“1”、“2”。所给的数据是一个长度为‘n’的数组,要使元素相邻,并按照红色、白色、蓝色顺序排列,只需要对它进行从小到大排序即可。(选择合适的排序算法对数组排序)
解题代码(JavaScript)
/**
* @param {number[]} nums
* @return {void} Do not return anything, modify nums in-place instead.
*/
var sortColors = function(nums) {
for(var i = 1;i<nums.length;i++){
for(var j = i;j>0;j--){
if(nums[j-1]>nums[j]){
var temp = nums[j-1];
nums[j-1] = nums[j];
nums[j] = temp;
}
}
}
};
我们使用插入排序,发现它的时间复杂度和空间复杂度都挺高的,就是因为插入排序的时间复杂度为O(n^2)。如果有时间复杂度低的排序算法或者调用排序函数,那么它需要的时间就会很少。
调用函数
/**
* @param {number[]} nums
* @return {void} Do not return anything, modify nums in-place instead.
*/
var sortColors = function(nums) {
nums.sort((a, b) => a - b);
};
当然在这个题目中使用排序算法算是一个比较偷懒的方法,我觉得这道题目并不是考如何排序,如果它给出的数字代表的颜色不是这样顺序的,那么用排序解题就不行了。像这种有三种数字的分类问题,我们可以让一类往左,一类往右,在这道题目中,我们可以遍历数组,让0存放在最左边,2存放在最右边,以实现分类。
力扣-220、存在重复元素Ⅲ(难度-中等)
题目描述
给你一个整数数组 nums 和两个整数 k 和 t 。请你判断是否存在 两个不同下标 i 和 j,使得 abs(nums[i] - nums[j]) <= t ,同时又满足 abs(i - j) <= k 。
如果存在则返回 true,不存在返回 false。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/contains-duplicate-iii
解题思路
我们需要判断每一个数和其他的数是否满足题目的要求,使用两个for循环,第一层表示当前数,第二层表示其他数,我们发现,如果这样的话每一个数据都会和自身发生一次运算,我们可以通过if条件判断语句来将这部分给去除掉。
解题代码(JavaScript)
注释掉的部分为冗余部分,加上也能实现。
/**
* @param {number[]} nums
* @param {number} k
* @param {number} t
* @return {boolean}
*/
var containsNearbyAlmostDuplicate = function(nums, k, t) {
// var temp = new Array();
var temp1 =0;
for(var i = 0;i<nums.length;i++){
// var temp1 =0;
for (var j=0;j<nums.length;j++){
if( i!=j&&Math.abs(nums[i] - nums[j]) <= t&&Math.abs(i - j) <= k){
temp1++;
}
}
// temp[i]= temp1;
}
// var u=0;
// for(var i = 0;i<temp.length;i++){
// if(temp[i]>0){
// u++;
// }
// }
if(temp1>0){
return true;
}else{
return false;
}
};
总结
1、暴力解法虽然可以解决很多的问题,但是计算机资源耗费严重,如果条件太复杂,运算速度缓慢。
2、如果题目的条件太多,暴力解法的分支太多。
3、如果数据量很大,不要考虑暴力解法。