【LeetCode 02】暴力法总结

简介: 【LeetCode 02】暴力法总结

一、适用条件

适用条件为:

  • 数组问题
  • 大部分例题都能用暴力破解法
    如【LeetCode 27】:给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

二、方法总结

  • 数组问题for循环遍历,有时候一成for循环,有时候两成for循环

for(int i=0;i<n;i++){
    xxx;//找val值
    for(int j=i+1;j<n;j++)
    {
        xxx;//覆盖
    }
}

三、暴力破解具体案例

3.1移除元素

根据例题:

int removeElement(int* nums, int numsSize, int val){
  for(int i=0;i<numSize;i++){//step1暴力循环查找
        if(nums[i]==val){//step2 查找值
        for(int j=i+1;j<numSize;j++){//step1暴力循环覆盖
            nums[j-1]=nums[j];
        }
            //step3数组元素i回退
            i--;
            numSize--;//数组长度因为覆盖值跟着减1
      }
    }
    return numSize;//新数组长度
}

3.2长度最小的子数组

step1:确定范围(最小子数组)的起点i终点j

for(int i=0;i<numsSize;i++){//起点
    
    for(int j=i;j<numSize;j++){//终点
        
    }
}

step2:累计记录子数组元素之和,一旦元素之和sum大于等于数组长度numsSize,就获取子数组的长度subLength(j-i+1

for(int i=0;i<numsSize;i++){//起点
    sum=0;
    for(int j=i;j<numSize;j++){//终点
        sum+=nums[j];
        if(sum>=numsSize){
            subLength=j-i+1;
        }
    }
}

step3:确定一个更新值result,初值赋为最大值 int32_max

int result=int32_max;//最小值为int32_min
result=result<subLength?result:subLength;//比较subLength与result并赋值
return result==int32_max?0:result;//没有符合条件的子数组,那么返回0

总过程:

int minSubArrayLen(int target, int* nums, int numsSize){
    int result=INT32_MAX;//最终的结果
    int sum=0;//子数组元素之和
    int subLength=0;//子数组的长度
    for(int i=0;i<numsSize;i++){
        sum=0;
        for(int j=i;j<numsSize;j++){
            sum+=nums[j];
            if(sum>=numsSize){
            subLength=j-i+1;
            result=result<subLength?result:subLength;
            break;
            }
        }
    }
    return result==INT32_MAX?0:result;
}

3.3两数之和

题意:

过程:

用暴力法解决:

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        for(int i=0;i<nums.size();i++){
            for(int j=i+1;j<nums.size();j++){//暴力破解标准模板
                if(nums[i]+nums[j]==target){
                    return {i,j};
                }
            }
        }
        return {};
    }
};

文章知识点

目录
相关文章
|
5月前
leetcode-1518:换酒问题
leetcode-1518:换酒问题
32 0
|
Python
LeetCode 1904. 你完成的完整对局数
一款新的在线电子游戏在近期发布,在该电子游戏中,以 刻钟 为周期规划若干时长为 15 分钟 的游戏对局。这意味着,在 HH:00、HH:15、HH:30 和 HH:45 ,将会开始一个新的对局,其中 HH 用一个从 00 到 23 的整数表示。游戏中使用 24 小时制的时钟 ,所以一天中最早的时间是 00:00 ,最晚的时间是 23:59 。
100 0
|
存储 Python
LeetCode 66. Plus One
给定表示非负整数的非空数字数组,加上整数的1。 存储数字使得最高有效数字位于列表的开头,并且数组中的每个元素包含单个数字。 您可以假设整数不包含任何前导零,除了数字0本身。
87 0
LeetCode 66. Plus One
leetcode 283 移动零
leetcode 283 移动零
53 0
leetcode第46题
这是自己开始想到的一个方法,考虑的思路是,先考虑小问题怎么解决,然后再利用小问题去解决大问题。没错,就是递归的思路。比如说, 如果只有 1 个数字 [ 1 ],那么很简单,直接返回 [ [ 1 ] ] 就 OK 了。 如果加了 1 个数字 2, [ 1 2 ] 该怎么办呢?我们只需要在上边的情况里,在 1 的空隙,也就是左边右边插入 2 就够了。变成 [ [ 2 1 ], [ 1 2 ] ]。
leetcode第46题
leetcode第37题
从上到下,从左到右遍历每个空位置。在第一个位置,随便填一个可以填的数字,再在第二个位置填一个可以填的数字,一直执行下去直到最后一个位置。期间如果出现没有数字可以填的话,就回退到上一个位置,换一下数字,再向后进行下去。
leetcode第37题
|
存储
leetcode第52题
可以发现对于同一条副对角线,row + col 的值是相等的。 对于同一条主对角线,row - col 的值是相等的。 我们同样可以用一个 bool 型数组,来保存当前对角线是否有元素,把它们相加相减的值作为下标。 对于 row - col ,由于出现了负数,所以可以加 1 个 n,由 [ - 3, 3 ] 转换为 [ 1 , 7 ] 。
leetcode第52题
|
存储
leetcode第57题
和上一道可以说是一个问题,只不过这个是给一个已经合并好的列表,然后给一个新的节点依据规则加入到合并好的列表。 解法一 对应 56 题的解法一,没看的话,可以先过去看一下。这个问题其实就是我们解法中的一个子问题没看的话,可以先过去看一下。这个问题其实就是我们解法中的一个子问题, 所以直接加过来就行了
leetcode第57题
leetcode第34题
从左向右遍历,一旦出现等于 target 的值就结束,保存当前下标。如果从左到右没有找到 target,那么就直接返回 [ -1 , -1 ] 就可以了,因为从左到右没找到,那么从右到左也一定不会找到的。如果找到了,然后再从右到左遍历,一旦出现等于 target 的值就结束,保存当前下标。 时间复杂度是 O(n)并不满足题意,但可以了解下这个思路,从左到右,从右到左之前也遇到过。
leetcode第34题
|
算法
leetcode第42题
也就是红色区域中的水, 数组是 height = [ 0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1 ] 。 原则是高度小于 2,temp ++,高度大于等于 2,ans = ans + temp,temp = 0。 temp 初始化为 0 ,ans 此时等于 2。 height [ 0 ] 等于 0 < 2,不更新。 height [ 1 ] 等于 1 < 2,不更新。 height [ 2 ] 等于 0 < 2, 不更新。 height [ 3 ] 等于 2 >= 2, 开始更新 height [ 4 ] 等于 1 < 2,temp = temp + 1 = 1。 h
leetcode第42题