栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

重拾刷题路01

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

重拾刷题路01

2022-02-13

78.Subsets(Medium)

https://leetcode.com/problems/subsets/

给出不含重复数字的数组,返回所有不含重复元素的子集。

(1)级联(通过增加一个数字,生成新的集合)

class Solution {
    public List> subsets(int[] nums) {
        List> result = new ArrayList<>();
        result.add(new ArrayList<>());
        
        for (int num : nums) {
            List> subList =  new ArrayList<>();
            for (List list : result) {
                List newList = new ArrayList<>();
                newList.addAll(list); // 复制现有结果
                newList.add(num); // 把新的数字加进去
                subList.add(newList);
            }
            result.addAll(subList); // 把本次加完数字产生的集合加到结果中
        }
        
        return result;
    }
}

 (2)递归回溯法

使用回溯法,和人的解题思路类似,先固定第一个数字,然后选第二个数字,以此类推。

class Solution {
    public List> subsets(int[] nums) {
        List> result = new ArrayList<>();
        for (int size = 0; size <= nums.length; size++) {
            recursive(0, size, new ArrayList<>(), nums, result);
        }
        return result;
    }
    
    public void recursive(int startPos, int resSize, List list, int[] nums, List> result) {
        if (list.size() == resSize) {
            result.add(new ArrayList<>(list));
            return;
        }
        for (int pos = startPos; pos < nums.length; pos++) {
            list.add(nums[pos]);
            recursive(pos + 1, resSize, list, nums, result);
            list.remove(list.size() - 1);
        }
    }
}

 67.Add Binary(Easy)

https://leetcode.com/problems/add-binary/

注意补零,由于StringBuilder只能补在最后,所以要先reverse,再补零,再reverse回来。

注意进位的逻辑。

class Solution {
    public String addBinary(String a, String b) {
        StringBuilder result = new StringBuilder();
        int lengthA = a.length();
        int lengthB = b.length();
        int length = 0;
        // 把短的字符串前面补0
        if (lengthA > lengthB) {
            length = lengthA;
            StringBuilder sb = new StringBuilder(b).reverse();
            for (int i = 1; i <= (lengthA - lengthB); i++) {
                sb.append('0');
            }
            b = sb.reverse().toString();
        } else if (lengthB > lengthA) {
            length = lengthB;
            StringBuilder sb = new StringBuilder(a).reverse();
            for (int i = 1; i <= (lengthB - lengthA); i++) {
                sb.append('0');
            }
            a = sb.reverse().toString();
        } else {
            length = lengthA;
        }
        // 是否要进位
        boolean plus = false;
        for (int pos = length - 1; pos >= 0; pos--) {
            char charA = a.charAt(pos);
            char charB = b.charAt(pos);
            char charResult;
            if (charA == '0' && charB == '0') {
                charResult = plus ? '1' : '0';
                plus = false;
            } else if (charA == '1' && charB == '1') {
                charResult = plus ? '1' : '0';
                plus = true;
            } else {
                charResult = plus ? '0' : '1';
            }
            result.append(charResult);
            if (pos == 0 && plus) { // 最后还有进位需要加一位
                result.append('1');
            }
        }
        return result.reverse().toString();
    }
}

228. Summary Ranges(Easy)

https://leetcode.com/problems/summary-ranges/

fast和slow两个指针即可。这里用了两个while循环,但是实际的时间复杂度还是O(n)。

class Solution {
    public List summaryRanges(int[] nums) {
        List result = new ArrayList<>();
        if (nums.length == 0) {
            return result;
        }
        int slow = 0;
        int fast = 0;
        while (slow < nums.length && fast < nums.length) {
            String str = String.valueOf(nums[slow]);
            while (fast < nums.length - 1 && nums[fast + 1] == nums[fast] + 1) {
                fast++;                
            }
            if (fast != slow) {
                str = str + "->" + nums[fast];
            }
            slow = fast + 1;
            fast = slow;
            result.add(str);
        }
        return result;
    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/738968.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号