• leetcode 18. 四数之和


    给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):

    • 0 <= a, b, c, d < n
    • abc 和 d 互不相同
    • nums[a] + nums[b] + nums[c] + nums[d] == target

    你可以按 任意顺序 返回答案 。

    1. // 给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]]
    2. // (若两个四元组元素一一对应,则认为两个四元组重复):
    3. // nums[a] + nums[b] + nums[c] + nums[d] = target
    4. // -1
    5. // 1 1 -1 -2 -> -2 -1 1 1
    6. // -2 + (-1) = -3
    7. // -1 1 2 2
    8. // -1+1 = 0
    9. class Solution {
    10. public:
    11. vectorint>> fourSum(vector<int>& nums, int target) {
    12. vectorint>> result;
    13. sort(nums.begin(),nums.end());
    14. int sum = 0;
    15. int left,right;
    16. for(int k=0;ksize();k++) {
    17. // 剪枝处理
    18. if(nums[k] > target && nums[k] >= 0) break;
    19. // 正确去重a方法
    20. if(k>0 && nums[k] == nums[k-1]) continue;
    21. for(int i = k + 1;i < nums.size();i++) {
    22. // 2级剪枝处理 ? 什么时候会出现这种情况
    23. if(nums[k] + nums[i] > target && nums[k] + nums[i] >= 0) {
    24. // [1,0,-1,0,-2,2]
    25. // -2 -1 0 0 1 2
    26. // 剪枝:-1 2
    27. // 剪枝: 0 1
    28. // 因为只要 nums[k] + nums[i] > target,那么 nums[i] 后面的数都是正数的话,就一定 不符合条件了。
    29. cout<< nums[k] <<" "<< nums[i] <
    30. cout<<"2级剪枝处理?"<
    31. break;
    32. }
    33. // 对nums[i]去重
    34. if(i > k+1 && nums[i] == nums[i-1]) continue;
    35. left = i + 1;
    36. right = nums.size() - 1;
    37. while(right > left) {
    38. sum = nums[k] + nums[i] + nums[left] + nums[right];
    39. if((long)sum > target) right--;
    40. else if((long)sum < target) left++;
    41. else {
    42. result.push_back(vector<int>{nums[k],nums[i],nums[left],nums[right]});
    43. // 对nums[left] 和 nums[right] 去重
    44. while(right > left && nums[right] == nums[right-1]) right--;
    45. while(right > left && nums[left] == nums[left-1]) left++;
    46. // 找到答案时,双指针同时收缩
    47. right--;
    48. left++;
    49. }
    50. }
    51. }
    52. }
    53. return result;
    54. }
    55. };

  • 相关阅读:
    maven基础入门
    U-net详解
    ProTable高级表格获取表单数据
    shell原理
    Java 之 IO流
    消息中间件-RocketMQ
    【实验4:MQTT交互实验】
    OpenWrt系统内核设置
    java第三讲:数组(Array)
    安卓抓jdwskey
  • 原文地址:https://blog.csdn.net/weixin_41987016/article/details/132852170