力扣解题之暴力解题法(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、如果数据量很大,不要考虑暴力解法。

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力做一只合格的前端攻城狮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值