LeetCode-3Sum -三数求和-有序数组扫描

https://oj.leetcode.com/problems/3sum/

先排序。然后枚举i属于[0,n-3]的这些数作为三元组的第一个数,令x=0-a[i]。这样就变成从[i+1,n)找出两个数加起来和等于x。

由于这些数是有序数,可以使用l,r指针对在两侧向中间逼近。这利用了一个事实:如果al+ar=x;对于l‘<l,r‘<r,则一定由al‘+ar‘<x。右边也是一样,所以可以这样向中间逼近的查找。

另外要注意答案需要去除重复。

typedef pair<int,pair<int,int>> scpair;
class Solution {
public:
    int m,n;
    vector<vector<int> > threeSum(vector<int> &num) {
        n=num.size();
        vector<vector<int> > res;
        if (n<3) return res;
        vector<int> &a=num;
        set   <scpair> st;
        sort(a.begin(),a.end());
        for (int i=0;i<n-2;i++) {
            scpair cr;
            cr.first=a[i];
            int l=i+1;
            int r=n-1;
            int x=0-a[i];
            while(l<r){
                int cs=a[l]+a[r];
                if (cs<x) l++;
                else if(cs>x) r--;
                else {
                    cr.second.first =a[l];
                    cr.second.second=a[r];
                    st.insert(cr);
                    l++;
                }
            }
        }
        for (auto it=st.begin();it!=st.end();it++) {
            vector<int> cur(3,0);
            cur[0]=it->first;
            cur[1]=it->second.first;
            cur[2]=it->second.second;
            res.push_back(cur);
        }
        return res;
    }
};
时间: 2024-11-08 10:02:19

LeetCode-3Sum -三数求和-有序数组扫描的相关文章

[LeetCode] 3Sum 三数之和

Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero. Note: Elements in a triplet (a,b,c) must be in non-descending order. (ie, a ≤ b ≤ c) The solut

【LeetCode每天一题】3Sum(三数之和)

Given an array nums of n integers, are there elements a, b, c in nums such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero. Note: The solution set must not contain duplicate triplets. Example: Given array nums =

leetCode 88. Merge Sorted Array 有序数组

88. Merge Sorted Array Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array. Note:You may assume that nums1 has enough space (size that is greater or equal to m + n) to hold additional elements from nums2. The n

[LeetCode] 4. 寻找两个有序数组的中位数

题目链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays/ 题目描述: 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 nums2 不会同时为空. 示例: 示例 1: nums1 = [1, 3] nums2 = [2] 则中位数是 2.0 示例 2: nums1 = [1, 2] n

[leetcode] 88. 合并两个有序数组

88. 合并两个有序数组 水题,没有在原数组上做,偷了个懒 class Solution { public void merge(int[] nums1, int m, int[] nums2, int n) { int[] ans = new int[m + n]; int i = 0, j = 0; int top = 0; while (i < m && j < n) { if (nums1[i] < nums2[j]) { ans[top++] = nums1[i

每日一题之LeetCode移除元素 删除有序数组重复元素

这两道题若是不使用官方题解的双指针做法,就会涉及到浅复制,深复制的问题,可参考如下https://blog.csdn.net/qq_32907349/article/details/52190796 .其中,此题将要使用深复制,但这会违背题意中的不开辟新的内存空间. 1.移除元素class Solution:def removeElement(self, nums, val):i = 0for j in range(0,len(nums)): if (nums[j] != val): nums[

领扣(LeetCode)合并两个有序数组 个人题解

给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 的元素数量分别为 m 和 n. 你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素. 示例: 输入: nums1 = [1,2,3,0,0,0], m = 3 nums2 = [2,5,6], n = 3 输出: [1,2,2,3,5,6] 这道题,第一想法是动态插入,但是种种错误

LeetCode 第4题 寻找有序数组的中位数

/*寻找两个有序数组的中位数 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 nums2 不会同时为空. 示例 1: nums1 = [1, 3]nums2 = [2] 则中位数是 2.0示例 2: nums1 = [1, 2]nums2 = [3, 4] 则中位数是 (2 + 3)/2 = 2.5 */ /*自己实现的只是简单代码. 分治解法 : http

leetcode(15)三数之和+去重

三数之和 解题思路:排序+双指针 class Solution { public List<List<Integer>> threeSum(int[] nums) { List<List<Integer>> result = new ArrayList<List<Integer>>(); if(nums.length<=2){ return result; } List<Integer> item = null; A