#LeeCode刷题#Array/Vector暴力无算法

1.两数之和

题目链接

在这里插入图片描述

  • 暴力即可
class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        int i,j;
        for(i = 0; i < nums.size()-1; i++)
        {
            for(j = i+1; j <nums.size(); j++)
            {
                if(nums[i] + nums[j] == target)
                {
                   return {i,j};
                }
            }
        }
        return {i,j};
    };
};

11. 盛最多水的容器

>题目链接
在这里插入图片描述
在这里插入图片描述

  • 这道题也相对简单,就是遍历找最优结果
class Solution {
public:
    int maxArea(vector<int>& height) {
        int result = 0;
        int i = 0, j = height.size() - 1;
        while (i < j) {
            int area = (j - i) * min(height[i], height[j]);
            result = max(result, area);
            if (height[i] < height[j])
                i++;
            else
                j--;
        }
        return result;
    }
};

15. 三数之和

题目链接

在这里插入图片描述

  • 和上一个题类似,用到了双指针,其中需要注意的就是如何节省时间,以及通过排序后判断下一个,避免重复
class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        int i = 0, j, k;
        vector<vector<int>> ans;
        if(nums.size()<3) //这里判断是参考了题解
            return ans;
        sort(nums.begin(), nums.end());
        if(nums[0] > 0)
            return ans;
        while(i < nums.size()){
            if(nums[i] > 0)//这里节省时间是参考了题解
                break;
            int left = i + 1, right = nums.size()-1;
            while(left < right){
                int a = nums[i], b = nums[left], c = nums[right];
                if(a + b + c == 0){
                    ans.push_back({nums[i], nums[left], nums[right]});
                    while(left < right && nums[left] == nums[left+1])//如果这里不加上判断,运行测试的时候就能看到多了一个,原因是他有两个-1,因为通过判断后一个是否相同,可以直接略过这种情况
                        left++;
                    while(left < right && nums[right] == nums[right-1])
                        right--;
                    left++;
                    right--;

                }else if(a + b + c > 0)
                    right--;
                else
                    left++;
            }
            while(i + 1 < nums.size() && nums[i] == nums[i+1])
                i++;
            i++;
        }
        return ans;
    }
};

16. 最接近的三数之和

题目链接
在这里插入图片描述

class Solution {
public:
    int threeSumClosest(vector<int>& nums, int target) {
        sort(nums.begin(), nums.end());
        int result = nums[0] + nums[1] + nums[2];
        int i;
        for(i = 0; i < nums.size(); i++){
            int left = i + 1, right = nums.size()-1;
            while(left < right){
                int ans = nums[i] + nums[left] + nums[right];
                if(abs(target - ans) < abs(target - result))
                    result = ans;
                if(ans > target)
                    right--;
                else if(ans < target)
                    left++;
                else
                    return result;
            }
        }
        return result;
    }
};

18. 四数之和

题目链接

在这里插入图片描述

class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
       vector<vector<int>> ans;
        sort(nums.begin(), nums.end());
        int i, j, left, right;
        for(i = 0; i < nums.size(); i++){
            for(j = i+1; j < nums.size(); j++){
                left = j + 1; right = nums.size() - 1;
                while(left < right){
                    if(nums[left] + nums[right] + nums[i] + nums[j] == target){
                        ans.push_back({nums[i], nums[j], nums[left], nums[right]});
                        while (left < right && nums[right] == nums[right - 1]) 
                            right--;
                        while (left < right && nums[left] == nums[left + 1]) 
                            left++;
                        right--;
                        left++;
                    } else if(nums[left] + nums[right] + nums[i] + nums[j] > target)
                            right--;
                    else
                        left++;
                }
                while (j + 1 < nums.size() && nums[j] == nums[j + 1]) 
                    j++;
            }
            while (i + 1 < nums.size() && nums[i] == nums[i + 1]) 
                    i++;
        }
        return ans;
    }
};

42. 接雨水

题目链接

在这里插入图片描述

class Solution {
public:
    int trap(vector<int>& height) {
        int sum = 0;
        for (int i = 0; i < height.size(); i++) {
            if (i == 0 || i == height.size() - 1) 
                continue;
            int rHeight = height[i]; // 记录右边柱子的最高高度
            int lHeight = height[i]; // 记录左边柱子的最高高度
            for (int r = i + 1; r < height.size(); r++) {
                if (height[r] > rHeight) rHeight = height[r];
            }
            for (int l = i - 1; l >= 0; l--) {
                if (height[l] > lHeight) lHeight = height[l];
            }
            int h = min(lHeight, rHeight) - height[i];
            if (h > 0) 
                sum += h;
        }
        return sum;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值