面试经典题---15.三数之和

15.三数之和

我的解法:

  • 预处理
    • 当nums大小小于3时,直接返回空的res
    • 对nums排序后,若首元素小于0或末尾元素大于0,也直接返回空的res
  • 双指针法找出三元组(nums[i]、nums[left]和nums[right])
    • i从0开始取值,对于每个i,判断是否存在三元组和为0的left(初值为i+1)和right(初值为n-1)
      • nums[i]+nums[left]+nums[right]<0时,左移left
      • nums[i]+nums[left]+nums[right]>0时,右移right
      • nums[i]+nums[left]+nums[right]=0时,将三元组下标插入res中
    • 注意排除重复的三元组,因此找到和为0的三元组后,要while循环判断下一步的left和right值是否重复,重复则直接跳过
  • 外部的while循环:每轮都是找出当前i是否存在满足题意的三元组,每轮结束后也要判断用while循环跳过重复的i
class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        int n = nums.size();
        vector<vector<int>> res;
        if(n < 3){
            return res;
        }
        sort(nums.begin(), nums.end());
        if(nums[0] > 0 || nums[n - 1] < 0){
            return res;
        } 
        int i = 0, left, right = n - 1;
        while(i < n){
            if(nums[i] > 0){
                break;
            }
            left = i + 1;
            right = n - 1;
            while(left < right){
                if(nums[i] + nums[left] < -nums[right]){
                    left++;
                }
                else if(nums[i] + nums[left] > -nums[right]){
                    right--;
                }
                else{
                    res.push_back({nums[i], nums[left], nums[right]});
                    left++;
                    right--;
                    while(left < right && nums[left - 1] == nums[left]){
                        left++;
                    }
                    while(left < right && nums[right + 1] == nums[right]){
                        right--;
                    }
                }
            }
            i++;
            while(i < n && nums[i] == nums[i - 1]){
                i++;
            }
        }
        return res;
    }
};

相关推荐

  1. 面试经典---15.之和

    2024-01-19 21:06:02       36 阅读
  2. 面试经典150——之和

    2024-01-19 21:06:02       18 阅读
  3. 【leetcode面试经典150】29.之和(C++)

    2024-01-19 21:06:02       16 阅读
  4. 力扣面试15015.之和

    2024-01-19 21:06:02       41 阅读
  5. 【leetcode面试经典150】44. 两之和(C++)

    2024-01-19 21:06:02       14 阅读
  6. 力扣经典150第四十:两之和

    2024-01-19 21:06:02       11 阅读
  7. 15. 之和

    2024-01-19 21:06:02       38 阅读
  8. 15.之和

    2024-01-19 21:06:02       17 阅读
  9. 15. 之和

    2024-01-19 21:06:02       11 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-19 21:06:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-19 21:06:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-19 21:06:02       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-19 21:06:02       20 阅读

热门阅读

  1. Android 优化广告图加载

    2024-01-19 21:06:02       36 阅读
  2. 【Python 千题 —— 基础篇】元组的合并

    2024-01-19 21:06:02       36 阅读
  3. IP地址及子网掩码

    2024-01-19 21:06:02       32 阅读
  4. HCIP-7

    HCIP-7

    2024-01-19 21:06:02      35 阅读
  5. 使用 Apache POI XDGF 读取 vsdx 文件

    2024-01-19 21:06:02       35 阅读
  6. MySQL 8.0 架构 之错误日志文件(Error Log)(1)

    2024-01-19 21:06:02       31 阅读
  7. 小程序中使用瀑布流组件的记录

    2024-01-19 21:06:02       40 阅读
  8. 大游戏并发使用什么阿里云服务器配置?

    2024-01-19 21:06:02       42 阅读