【LeetCode】259 3Sum Smaller

题目:

Given an array of n integers nums and a target, find the number of index triplets i, j, k with 0 <= i < j < k < n that satisfy the condition nums[i] + nums[j] + nums[k] < target.

For example, given nums = [-2, 0, 1, 3], and target = 2.

Return 2. Because there are two triplets which sums are less than 2:

[-2, 0, 1]
[-2, 0, 3]

Follow up:

Could you solve it in O(n^2) runtime?

 

题解:

  (我没舍得花钱。。。咳咳,这样不太好QAQ,代码都没有提交过,所以以后来看得注意一下代码的正确性。)

  老规矩,第一个想法是啥?必须的暴力解啊,哈哈,虽然时间复杂度是O(n^3);这里

Solution 1 ()

 1 class Solution {
 2 public:
 3     int threeSumSmaller(vector<int>& nums, int target) {
 4         int cnt = 0;
 5         sort(nums.begin(), nums.end());
 6         int n = nums.size();
 7         for(int i=0; i<n-2; i++) {
 8             if(i>0 && nums[i] == nums[i-1]) continue;
 9             for(int j=i+1; j<n-1; j++) {
10                 if(j>i+1 && nums[j] == nums[j-1]) continue;
11                 for(int k=j+1; k<n; k++) {
12                     if(k>j+1 && nums[k] == nums[k-1]) continue;
13                     if(nums[i] + nums[j] + nums[k] < target) cnt++;
14             else break;
15                 }
16             }
17         }
18     }
19 };

 

  若想时间复杂度为O(n^2),那么就需要和之前的3Sum题目一样,两指针为剩余数组的头尾指针,搜索遍历。这里需要注意的是,当sum<target时,cnt需要加上k-j,而不是cnt++,因为数组已经排好序,若尾指针当处于位置k时满足条件,则j<position<=k的pos都满足这个条件,故cnt需加上k-j.

Solution 2 ()

 1 class Solution {
 2 public:
 3     int threeSumSmaller(vector<int>& nums, int target) {
 4         int cnt = 0;
 5         sort(nums.begin(), nums.end());
 6         int n = nums.size();
 7         for(int i=0; i<n-2; i++) {
 8             if(i>0 && nums[i] == nums[i-1]) continue;
 9             int j = i + 1, k = n - 1;
10             while(j<k) {
11                 int sum = nums[i] + nums[j] + nums[k];
12                 if(sum < target) {
13                     cnt += k - j;
14                     j++;
15                 }
16                 else k--;
17             }    
18         }
19         return cnt;
20     }
21 };

 

 

 

posted @ 2017-04-15 21:00  Vincent丶丶  阅读(185)  评论(0编辑  收藏  举报