zoukankan      html  css  js  c++  java
  • leetcode 0207

    ✅ 561. 数组拆分 I

    https://leetcode-cn.com/problems/array-partition-i

    • 评论:

    其实就是把从a1到an数组下标为奇数的数都加起来,题目花里胡哨的

    比较各个语言的排序算法速度吗?

    • 解答
    /*
    思路:
    排序,然后将下标为 0、2、4 ... 个数相加即可。
    由于是纯数字,并且限定了数字范围,所以可使用基数排序达到 O(n) 复杂度。
    数字范围 [-10000, 10000],所以可创建 n[20001],对每个元素加 10000 使其变为正数。
    */
    int arrayPairSum(int* nums, int numsSize)
    {
        int n[20001] = { 0 }, i, j, sum;
        for (i = 0; i < numsSize; i++)                  //建立值、键哈希表,即基数排序
            n[nums[i] + 10000]++;                       //保证下标为正数
        for (i = j = sum = 0; i < 20001; )              //将下标为 0、2、4 ... 的相加
            if (n[i])                                   //判断是否存在该数,若存在则判断是否偶数下标
            {
                //tt 这里的 i - 10000 比较奇妙
                if (j % 2 == 0) sum += i - 10000;       //偶数下标,累加
                j++;                                    //计数
                n[i]--;                                 //该值减 1
            }
            else    i++;                                //不存在,跳过该值
        return sum;
    }
    
    class Solution:
        def arrayPairSum(self, nums: List[int]) -> int:
            return sum(sorted(nums)[::2])
    
    '''执行用时 :
    416 ms
    , 在所有 Python3 提交中击败了
    23.18%
    的用户
    内存消耗 :
    15.5 MB
    , 在所有 Python3 提交中击败了
    49.94%
    的用户'''
    

    ✅ 1025. 除数博弈

    https://leetcode-cn.com/problems/divisor-game

    聪明的数学归纳法:

    • 结论是:

    奇则输,偶则赢

    • 解释:

    基本思路:

    最终结果应该是占到 2 的赢,占到 1 的输;

    若当前为奇数,奇数的约数只能是奇数或者 1,因此下一个一定是偶数;

    若当前为偶数, 偶数的约数可以是奇数可以是偶数也可以是 1,因此直接减 1,则下一个是奇数;

    因此,奇则输,偶则赢。

    return N%2==0

    动态规划又来了(没理解,todo 0207):

    • 基本思路:

    将所有的小于等于 N 的解都找出来,基于前面的,递推后面的。

    状态转移: 如果 i 的约数里面有存在为 False 的(即输掉的情况),则当前 i 应为 True;如果没有,则为 False。

    笔记:
    状态转移: 如果 i 的约数里面有存在为 False 的(即输掉的情况),(tt4)则当前 i 应为 True;如果没有(约数里没有输掉,则当前是输掉,wtf?),则为 False。????

    class Solution:
        def divisorGame(self, N: int) -> bool:
            target = [0 for i in range(N+1)]
            target[1] = 0 #若爱丽丝抽到1,则爱丽丝输
            if N<=1:
                return False
            else:
            
                target[2] = 1 #若爱丽丝抽到2,则爱丽丝赢
                for i in range(3,N+1):
                    for j in range(1,i//2):
                        # 若j是i的余(这里应该说:约数 吧)数且target[i-j]为假(0)的话,则代表当前为真(1)
                        if i%j==0 and target[i-j]==0:
                            target[i] = 1 # 对应:tt4 则当前 i 应为 True
                            break
                return target[N]==1
    
    '''作者:pandawakaka
    链接:https://leetcode-cn.com/problems/divisor-game/solution/python3gui-na-fa-by-pandawakaka/
    来源:力扣(LeetCode)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。'''
    
    

    ✅ 557. 反转字符串中的单词 III

    https://leetcode-cn.com/problems/reverse-words-in-a-string-iii

    • my c ans:
    char * reverseWords(char * s){
        int n = strlen(s);
        int begin = 0, end;
        for(int i = 0; i < n + 1; i++) {
            // i travel to a word end(aka the blank or end0 after a word)
            if(s[i] == ' ' || s[i] == '') {
                for (end = i - 1; begin < end; begin++, end--) {
                    int tmp = s[begin];
                    s[begin] = s[end];
                    s[end] = tmp;
                }
                begin = i + 1;// begin no locate the start of next word
            }
        }
        return s;
    }
    
    执行用时 :
    12 ms
    , 在所有 C 提交中击败了
    58.89%
    的用户
    内存消耗 :
    8.2 MB
    , 在所有 C 提交中击败了
    87.22%
    的用户
    

    py 中的 字符 split 与 列表 倒序的 组合手法疑问

    • 结果:

    • 代码如下:

    ✅ 852. 山脉数组的峰顶索引

    https://leetcode-cn.com/problems/peak-index-in-a-mountain-array

    int peakIndexInMountainArray(int* A, int ASize){
        int max = 0;
        int soldier = 0;
        for (; soldier < ASize - 1; soldier++) {
            if(A[soldier] > A[max]) {
                max = soldier;
            }
        }
        return max;
    }
    
    执行用时 :
    16 ms
    , 在所有 C 提交中击败了
    50.41%
    的用户
    内存消耗 :
    7.6 MB
    , 在所有 C 提交中击败了
    84.08%
    的用户
    

    提升,by knowing 山顶的唯一性

    int peakIndexInMountainArray(int* A, int ASize){
        int soldier = 0;
        for (; A[soldier] < A[soldier + 1]; soldier++) {
            //do nothing
        }
        return soldier;
    }
    
    执行用时 :
    24 ms
    , 在所有 C 提交中击败了
    9.92%
    的用户
    内存消耗 :
    7.7 MB
    , 在所有 C 提交中击败了
    24.08%
    的用户
    
  • 相关阅读:
    PHP正则表达式概念
    PHP函数
    PHP基础知识总
    PHP运算符知识点
    PHP基础知识1
    学习JavaScript时的三部分
    怎么面向对象编程呢?
    封装、继承、多态
    JS面向对象
    作业day01
  • 原文地址:https://www.cnblogs.com/paulkg12/p/12272295.html
Copyright © 2011-2022 走看看