递归问题(LeetCode124)中的Atomic Integer或int []

时间:2019-06-24 23:11:05

标签: java recursion atomic

所以这是LeetCode问题124 我使用Java时没有全局变量,为什么我们需要使用int []或atomic但不能使用int来存储最大值? 我在这里缺乏什么知识?

$NICs = Get-NetAdapter | Where-Object {$_.PhysicalMediaType -eq 'Native 802.11' -or $_.PhysicalMediaType -eq 'Wireless LAN'}

2 个答案:

答案 0 :(得分:0)

在具有诸如C,C ++,C#,PHP,Perl等引用的语言中,您可以将指向值的指针或引用传递给函数,然后就地对其进行修改:

C:/Program Files/PostgreSQL/11/lib/libpq.dll: file not recognized: File format not recognized
collect2.exe: error: ld returned 1 exit status
CMakeFiles\TP_BD.dir\build.make:86: recipe for target 'TP_BD.exe' failed
CMakeFiles\Makefile2:71: recipe for target 'CMakeFiles/TP_BD.dir/all' failed
mingw32-make.exe[3]: *** [TP_BD.exe] Error 1
mingw32-make.exe[2]: *** [CMakeFiles/TP_BD.dir/all] Error 2
mingw32-make.exe[1]: *** [CMakeFiles/TP_BD.dir/rule] Error 2
CMakeFiles\Makefile2:83: recipe for target 'CMakeFiles/TP_BD.dir/rule' failed
mingw32-make.exe: *** [TP_BD] Error 2
Makefile:117: recipe for target 'TP_BD' failed

Java严格按值传递,并且不提供指针或地址运算符。您在此处提供的代码滥用数组来克服此限制。在下面的代码中,将调用范围中对数组的引用复制并按值传递给#include <stdio.h> void doit(int *ptr_to_n) { *ptr_to_n = 42; // modifies the value pointed to by ptr_to_n by a dereference } int main(void) { int n = 415; doit(&n); printf(" %d\n", n); // => 42 return 0; } ,但是res仍指向与res相同的基础对象,因此该数组本身不被复制,仅被别名。

arr

输出:

class Main {
    public static void main(String[] args) {
        int n = 415;
        int[] arr = {415};
        doit(n);
        doitPointer(arr);

        System.out.println("Copy primitive: " + n);
        System.out.println("Copy reference to object: " + arr[0]);
    }

    static void doit(int n) {
        n = 42; // assignment to local variable which will be unavailable in outer scope
    }

    static void doitPointer(int[] res) {
        res[0] = 42; // assignment to element in referenced array, available in outer scope
    }
}

在竞争性编程中,这是一种有用的且可以接受的技术,可以简化逻辑,但是在生产环境中,这通常是懒惰的实践,因为它破坏了封装,使代码难以推理并且具有语义成本。

使用类封装值,将函数放在范围内,以便它们可以修改私有类成员,或者重写逻辑以避免引用。

答案 1 :(得分:0)

这真的很hacky。您正在尝试破解此解决方案,以通过使用容器作为输入变量来允许输出参数。您将其放入容器中是为了避免整数的按值传递特性,该特性会将参数复制到函数中。

相反,为什么不只返回多个值呢?

/**
 * Return an array containing the overall nodes 
 * maximum height and the overall max gain.
 **/
public int[] maxGain(TreeNode currNode) {
    if (currNode == null) {
        return new int[] { 0, Integer.MIN_VALUE };
    }

    int[] leftResult = maxGain(currNode.left);
    int[] rightResult = maxGain(currNode.right);

    int maxHeight = Math.max(leftResult[0], rightResult[0]) + currNode.val;

    int currGain = leftResult[0] + rightResult[0] + currNode.val;

    int maxGain = Math.max(currGain, Math.max(leftResult[1], rightResult[1]));

    return new int[] { maxHeight, maxGain };
}

public int maxPathSum(TreeNode root) {
    int[] result = maxGain(root);
    return result[1];
}