2022-03-08 「75. 颜色分类」

今日是中等题:https://leetcode-cn.com/problems/sort-colors/
题目倒是不难,就是实现一个快排,思路也很清晰,双指针头尾往中间走,new了一个新的数组对象来存放排序后的结果。
但最后提交的时候傻眼了,题目的方法类型是void,也就是说没有返回值,我开始自作聪明把void改成了int[]也并没有什么卵用。

调试的时候发现一切正常,猜测可能题目本身想要的就是我在nums内部做排序,可是这样要做交换了,我不喜欢交换。
所以自作聪明二连,我直接把排序后的数组ans赋值给nums就好了吧?
于是操作了一波:

nums =  ans;

再次运行果然又打脸了。

在请教了开发小哥哥之后,终于意识到了,我这是栽在了入门坑里,上述的方法是引用而非赋值,并没有实际改变nums对象,所以返回的依旧是毫发无伤的nums本人没错。
关于Java对象的引用与赋值,可参考这篇:https://www.cnblogs.com/liuurick/p/10713656.html

于是在和开发大大讨论之后,我发现可以改用这样的方式做赋值:

for (int k =0 ;k<len;k++) {
            nums[k]=ans[k];
        }

虽然最终用了3次for循环,但是还是倔强地没有用答案的交换法,这里贴一下并不优雅的代码吧:

class Solution {
    public void sortColors(int[] nums) {
        int len = nums.length;
        int head = 0;
        int tail = len-1;
        int[] ans = new int[len];
        for (int i=0;i<len;i++) {
            if (nums[i]==0) {
                ans[head] = 0;
                head++;
            }
            else if (nums[i]==2) {
                ans[tail] = 2;
                tail--;
            }
        }
        for (int j=head; j<tail+1; j++) {
            ans[j] = 1;
        }
        for (int k =0 ;k<len;k++) {
            nums[k]=ans[k];
        }
    }
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容