上岸算法 I LeetCode Weekly Contest 227解题报告

这篇博客介绍了四个算法问题的解题思路:1) 检查数组是否经排序和轮转得到,采用枚举和检查的方法;2) 移除石子的最大得分,通过贪心策略每次移除最多的和最少的;3) 构造字典序最大的合并字符串,利用贪心策略选择较大字符;4) 最接近目标值的子序列和,将问题转化为超大背包问题并使用二分查找。这些题目涉及排序、搜索、字符串处理和优化策略。
摘要由CSDN通过智能技术生成

No.1 检查数组是否经排序和轮转得到

解题思路

枚举、检查。

代码展示

class Solution {
    public boolean check(int[] nums) {
        for (int i = 0; i < nums.length; i++) {
            if (check(nums, i)) {
                return true;
            }
        }
        return false;
    }

    private boolean check(int[] nums, int i) {
        for (int j = 1; j < nums.length; j++) {
            if (nums[(i + j - 1 + nums.length) % nums.length] > nums[(i + j) % nums.length]) {
                return false;
            }
        }
        return true;
    }
}

No.2 移除石子的最大得分

解题思路

贪心,每次移除最多的和最少的。

代码展示

class Solution {
    public int maximumScore(int a, int b, int c) {
        int res = 0;
        int[] nums = {a, b, c};
        Arrays.sort(nums);
        for (; nums[1] != 0; res++) {
            if (nums[0] == 0) {
                nums[1]--;
            } else {
                nums[0]--;
            }
            nums[2]--;
            Arrays.sort(nums);
        }
        return res;
    }
}

No.3 构造字典序最大的合并字符串

解题思路

贪心,详见注释。

代码展示

class Solution {
    public String largestMerge(String word1, String word2) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0, j = 0; i < word1.length() || j < word2.length(); ) {
            // word1[i] != word2[j] 时, 选择大的字符
            if (i == word1.length()) {
                sb.append(word2.charAt(j++));
            } else if (j == word2.length()) {
                sb.append(word1.charAt(i++));
            } else if (word1.charAt(i) > word2.charAt(j)) {
                sb.append(word1.charAt(i++));
            } else if (word1.charAt(i) < word2.charAt(j)) {
                sb.append(word2.charAt(j++));
            } else {
                // word1[i] == word2[j] 时
                // 找到第一个不相等的 word1[i + t] != word2[j + t]
                // 选择大的字符所在的字符串
                Character c1 = null, c2 = null;
                for (int t = 1; i + t < word1.length() && j + t < word2.length(); t++) {
                    if (word1.charAt(i + t) != word2.charAt(j + t)) {
                        c1 = word1.charAt(i + t);
                        c2 = word2.charAt(j + t);
                        break;
                    }
                }
                // 若后续全都相等,选择长的
                if (c1 == null && word1.length() - i > word2.length() - j) {
                    sb.append(word1.charAt(i++));
                } else if (c1 == null && word1.length() - i < word2.length() - j) {
                    sb.append(word2.charAt(j++));
                } else if (c1 != null && c1 > c2) {
                    sb.append(word1.charAt(i++));
                } else {
                    sb.append(word2.charAt(j++));
                }
            }
        }
        return sb.toString();
    }
}

No.4 最接近目标值的子序列和

解题思路

超大背包问题。

代码展示

class Solution {
    public int minAbsDifference(int[] nums, int goal) {
        int n = nums.length;
        int half = n / 2;
        int[] a = new int[1 << half];
        for (int i = 0; i < (1 << half); i++) {
            int sum = 0;
            for (int j = 0; j < half; j++) {
                if (((i >> j) & 1) > 0) {
                    sum += nums[j];
                }
            }
            a[i] = sum;
        }
        int half2 = n - half;
        int[] b = new int[1 << half2];
        for (int i = 0; i < (1 << half2); i++) {
            int sum = 0;
            for (int j = 0; j < half2; j++) {
                if (((i >> j) & 1) > 0) {
                    sum += nums[half + j];
                }
            }
            b[i] = sum;
        }
        Arrays.sort(b);
        int ans = Integer.MAX_VALUE;
        for (int v : a) {
            int pos = binarySearch(b, goal - v);
            for (int j = Math.max(0, pos - 2); j < Math.min(b.length, pos + 2); j++) {
                ans = Math.min(ans, Math.abs((v + b[j]) - goal));
            }
        }
        return ans;
    }

    public static int binarySearch(int[] nums, int key) {
        int start = 0, end = nums.length - 1;
        while (start + 1 < end) {
            int mid = (start + end) / 2;
            if (nums[mid] < key) {
                start = mid;
            } else {
                end = mid;
            }
        }
        return nums[start] < key ? end : start;
    }
}
基于MMSkeleton工具包中的ST-GCN模型实现一种基于动态拓扑图的人体骨架动作识别算法python源码+使用说明.zip 改进ST-GCN模型的骨架拓扑图构建部分,使用持续学习思想动态构建人体骨架拓扑图. 将具有多关系特性的人体骨架序列数据重新编码为关系三元组, 并基于长短期记忆网络, 通过解耦合的方式学习特征嵌入. 当处理新骨架关系三元组时, 使用部分更新机制 动态构建人体骨架拓扑图, 将拓扑图送入ST-GCN进行动作识别。 运行MMSKeleton工具包参考[GETTING_STARTED.md](./doc/GETTING_STARTED.md) - 单独使用ST-GCN模型进行人体动作识别参考[START_RECOGNITION.md](./doc/START_RECOGNITION.md) - 训练基于动态拓扑图的人体骨架动作识别算法 ``` shell cd DTG-SHR python ./mmskeleton/fewrel/test_lifelong_model.py ``` - 测试基于动态拓扑图的人体骨架动作识别算法 ``` shell cd DTG-SHR python ./mmskeleton/fewrel/train_lifelong_model.py ``` - 可视化算法运行结果 基于web server搭建前端 [[参考]](https://blog.csdn.net/gzq0723/article/details/113488110) 1、前端模块:包含 'static与'templates'文件夹为界面展示相关的代码。 templates里面包含了两个html的结构文档,用来定义浏览器的显示界面。 static里面的css和img用来修饰界面。 2、服务模块: servel.py里面是web服务的一个业务逻辑。 运行算法性能可视化web服务 ``` shell cd DTG-SHR python ./server.py ``` 【备注】 1、该资源内项目代码百分百可运行,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值