一、适用条件
适用条件为:
- 数组问题
- 大部分例题都能用暴力破解法
如【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 {}; } };
文章知识点