Sum

四数之和算法解析

【题目描述】

 

 

 

 

Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = target? Find all unique quadruplets in the array which gives the sum of target. 
  Note: 
  Elements in a quadruplet (a,b,c,d) must be in non-descending order. (ie, a ≤ b ≤ c ≤ d) 

 

  The solution set must not contain duplicate quadruplets.

 

 

For example, given array S = {1 0 -1 0 -2 2}, and target = 0.  

   A solution set is: (-1, 0, 0, 1) (-2, -1, 1, 2) (-2, 0, 0, 2)

 

 

 

 

 

【题目大意】

 

 

 

 

给定一个整数数组,找出a + b + c + d = target的唯一解。

 

 

 

 

 

【本题答案】

 

 

 

package blog;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;

/**
 * @author yesr
 * @create 2018-04-20 下午11:59
 * @desc
 **/
public class Test0420 {
    public List<List<Integer>> fourSum(int[] num, int target) {
        List<List<Integer>> result = new LinkedList<>();
        if (num == null || num.length < 4) {
            return result;
        }

        Arrays.sort(num); // 对数组进行排序

        for (int i = 0; i < num.length - 3; i++) { // 第一个加数
            if ( i > 0 && num[i] == num[i - 1]) { // 第一个加数使用不重复
                continue;
            }

            for (int j = num.length - 1; j > i + 2 ; j--) { // 第四个加数
                if (j < num.length - 1 && num[j] == num[j + 1]) { // 第四个加数使用不重复
                    continue;
                }

                int start = i + 1; // 第二个加数
                int end = j - 1; // 第三个加数
                int n = target - num[i] - num[j];

                while (start < end) {
                    if (num[start] + num[end] == n) {
                        List<Integer> four = new ArrayList<>(4);
                        four.add(num[i]);
                        four.add(num[start]);
                        four.add(num[end]);
                        four.add(num[j]);

                        result.add(four);

                        do {
                            start++;
                        } while (start< end && num[start] == num[start - 1]); // 保证再次使用第二个数不重复

                        do {
                            end--;
                        } while (start < end && num[end] == num[end + 1]); // 保证再次使用第三个数不重复
                    } else if (num[start] + num[end] < n) {
                        do {
                            start++;
                        } while (start< end && num[start] == num[start - 1]); // 保证再次使用第二个数不重复
                    } else {
                        do {
                            end--;
                        } while (start < end && num[end] == num[end + 1]); // 保证再次使用第三个数不重复
                    }
                }
            }
        }


        return result;
    }
}

 

### C语言中 `sum` 函数或变量的用法和示例 #### 一、作为全局变量的 `sum` 在C语言中,`sum` 可以被定义为一个全局变量来存储某些计算的结果。下面是一个典型的例子: ```c #include <stdio.h> /* 全局变量声明 */ int sum; int main () { /* 局部变量声明 */ int a, b; /* 实际初始化 */ a = 10; b = 20; sum = a + b; // 将两个数相加并将结果赋给全局变量 sum printf ("sum = %d\n", sum); return 0; } ``` 上述代码展示了如何通过局部变量 `a` 和 `b` 计算它们的和,并将结果保存到全局变量 `sum` 中[^1]。 --- #### 二、作为函数名的 `sum` 当 `sum` 被用于函数名称时,它通常用来执行某种形式的累加操作。以下是一些常见的实现方式: ##### 1. 基本求和功能 此函数实现了从 1 到某个整数值之间的连续整数之和: ```c int sum() { int i, total_sum = 0; for (i = 1; i <= 100; i++) { total_sum += i; // 累计总和 } return total_sum; } ``` 该函数返回从 1 至 100 的所有整数的累积和[^3]。 ##### 2. 参数化求和 如果希望让求和范围更加灵活,则可以通过参数传递起始值和终止值: ```c int sum(int start, int end) { int i, total_sum = 0; for (i = start; i <= end; i++) { total_sum += i; } return total_sum; } int main() { int result = sum(1, 10); // 求解从1至10的和 printf("Sum from 1 to 10 is: %d\n", result); return 0; } ``` 这里展示了一个带有可变范围的求和方法[^4]。 --- #### 三、结合函数指针使用的 `sum` 除了直接调用外,还可以利用函数指针间接访问 `sum` 函数。这种方式特别适用于动态绑定场景或者回调机制的设计: ```c #include <stdio.h> // 定义一个简单函数 int sum(int a, int b) { return a + b; } int main() { // 定义并初始化一个指向 sum 函数的指针 int (*add)(int, int) = sum; // 使用函数指针调用实际逻辑 int result = add(3, 4); printf("Result of adding 3 and 4 using function pointer: %d\n", result); return 0; } ``` 这段代码说明了如何创建以及应用一个名为 `add` 的函数指针去代替原始函数名 `sum` 进行运算[^2]。 --- #### 四、总结 无论是作为存储数据的容器还是处理业务逻辑的方法载体,在不同的上下文中,“sum” 都扮演着重要角色。它可以代表最终结果的数据成员;也可以成为封装特定算法行为的过程实体——这取决于开发者的需求及其设计意图。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值