zoukankan      html  css  js  c++  java
  • nSum “已知target再求和”类型题目总结:n-2重循环+left/right

    Sum类的题目一般这样:

    input: nums[], target

    output: satisfied arrays/ lists/ number

    拿到题目,首先分析:

    1. 是几个数的sum

    2. sum是要求等于target还是小于还是大于还是closest

    3. 返回的是原数组下标还是其他

     

    对于这类题目,我们经常用双指针的方法。即排序后,左指针指向起点,右指针指向终点。

    • 如果sum等于target,加入结果/总数目+1
    • 如果sum大于target,右指针左移
    • 如果sum小于target,左指针右移

    还有些情况下,我们需考虑去重。去重有两种方法:

    • 利用HashSet预先存下满足条件的值
    • 指针移动去重

    第一种方法由于常常需要更多的空间,所以不太建议。

    第二种方法的模板是:先判断值,再去重。(去重是当前的element和它前一个element比较)

    这里给出一个 n Sum 的模板

    public class Solution {
        public void nSum(int[] nums, int target) {
            // Check whether input is valid
            if (nums == null || nums.length < n) {
                return;
            }
    
            // Sort input array
            Arrays.sort(nums);
    
            // Fix one parameter
            int length = nums.length;
            for (int i = 0; i < length - n + 1; i++) {
                // Avoid duplicate 1
                if (i > 0 && nums[i] == nums[i - 1]) {
                    continue;
                }
    
                // Fix more parameters
                ...
                // Until two parameters left
    
                // start and end are decided by innerest parameter value
                int left = start;
                int right = end;
                while (left < right) {
                    int sum = nums[i] + .. + nums[left] + nums[right];
                    if (sum == target) {
                        // Some action
                        left++;
                        right--;
                        // Avoid duplicate 2
                        while (left < right && nums[left] == nums[left - 1]) {
                            left++;
                        }
                        while (left < right && nums[right] == nums[right + 1]) {
                            right--;
                        }
                    } else if (sum < target) {
                        left++;
                        while (left < right && nums[left] == nums[left - 1]) {
                            left++;
                        }
                    } else {
                        right--;
                        while (left < right && nums[right] == nums[right + 1]) {
                            right--;
                        }
                    }
                }
            }
        }
    }
  • 相关阅读:
    c# WF 第11节 RichTextBox
    c# WF 第10节 textbox 控件
    c# WF 第9节 button控件
    c# WF 第8节 label控件
    c# WF 第7节 对控件的基本操作
    c# WF 第6节 MDI窗体
    c# WF 第5节 窗体的控件
    Python接口自动化之动态数据处理
    Saturn分布式调度之系统架构简介
    Jmeter系列之接口依赖
  • 原文地址:https://www.cnblogs.com/immiao0319/p/9300698.html
Copyright © 2011-2022 走看看