LeetCode Hot 100 第7天

1. 189 轮转数组(规律)

链接题目链接
题解

题解 时间复杂度O(n)

  1. k = n * len + x (len等于数组长度),n * len 可以忽略掉(将数组向右轮转n * len次,数组不会发生任何变化),所以真正需要处理的轮转次数 x = k % len
  2. 数组像右轮转x次 = 尾部x个元素移动到数组头部 + 其余元素向右移动
  3. 尾部x个元素移动到数组头部:先将数组反转,再将0, x - 1下标元素反转
  4. 其余元素向右移动:先将数组反转,再将x, len - 1下标元素反转

代码

java 复制代码
class Solution {
    public void rotate(int[] nums, int k) {
        int len = nums.length;
        k = k % len;
        swapRange(nums, 0, len - 1);
        swapRange(nums, 0, k - 1);
        swapRange(nums, k, len - 1);
    }

    private void swapRange(int[] nums, int l, int r) {
        while(l < r) {
            int temp = nums[l];
            nums[l] = nums[r];
            nums[r] = temp;
            l ++;
            r --;
        }
    }
}

2. 238 除自身以外数组的乘积(公式 + 规律)

链接题目链接
题解

题解 时间复杂度O(n)

  1. answer[i] = nums 中除 nums[i] 之外其余各元素的乘积 = 所有乘积 / nums[i](nums[i]=0的情况需要特殊讨论)
  2. 遍历数组维护所有元素的乘积
  3. 注意:当numsi=0 && 0的个数>1时,answer数组都是0
  4. 注意:当numsi=0 && 0的个数=1时,answeri = 非0数的乘积,answerj = 0 (j != i)
  5. 其他情况参考1

代码

java 复制代码
class Solution {
    public int[] productExceptSelf(int[] nums) {
        // 0的个数 个数 > 1 直接返回0数组 个数 == 0 乘积不算0 记录0下标 个数 == 0 直接算0下标
        int len = nums.length;
        int zeroCount = 0;
        int zeroIndex = -1;
        int allMultiplicationResult= 1;
        for (int i = 0; i < len; ++ i) {
            if (nums[i] == 0) {
                zeroCount ++;
                zeroIndex = i;
            } else {
                allMultiplicationResult *= nums[i];
            }
        }
        int[] ans = new int[len];
        if (zeroCount > 1) {
            return ans;
        } 
        if (zeroCount == 1) {
            ans[zeroIndex] = allMultiplicationResult;
            return ans;
        }

        for (int i = 0; i < len; ++ i) {
            ans[i] = allMultiplicationResult / nums[i];
        }
        
        return ans;
    }
}

3. 41 缺失的第一个正数(规律 + hash)

链接题目链接
题解

题解 时间复杂度O(n)

  1. 当nums数组长度为n时,缺失的最小整数的最大值是n+1,例如最极端的情况1, 2, 3 那么确缺失的最小整数 = 4
  2. 从1遍历至n,hash存储出现过的值,如果i值 不存在hash中,那么就是缺失的最小整数
  3. 题目要求时间复杂度为O(1)常数级别,那么只能把hash存储在nums数组中体现
  4. numsi <= 0的情况元素无效,那么等值替换为n + 1(即最大可能取到的值)
  5. 因为答案存在1, n + 1,那么我们把i值映射在i-1下标元素上,用负数表示已存在(负数不会影响nums的绝对值)
  6. 遍历元素,做完hash映射时,再遍历一遍数组,如果numsi > 0(没被hash标记),那么缺失的最小整数就是i +1
  7. 遍历元素,数组都被标记时(numsi <= 0),那么缺失的最小整数就是n + 1

代码

java 复制代码
class Solution {
    public int firstMissingPositive(int[] nums) {
        int len = nums.length;
        for (int i = 0; i < len; ++ i) {
            if (nums[i] <= 0) {
                nums[i] = len + 1;
            }
        }
        for (int i = 0; i < len; ++ i) {
            int absNum = Math.abs(nums[i]);
            if (absNum <= len) {
                nums[absNum - 1] = -1 * Math.abs(nums[absNum - 1]);
            }
        }
        for (int i = 0; i < len; ++ i) {
            if (nums[i] > 0) {
                return i + 1;
            }
        }
        return len + 1;
    }
}

如果对你有帮助,辛苦点个赞,谢谢啦,朋友!!!

相关推荐
jinyishu_40 分钟前
哈希表原理与开放定址法C++实现
c++·哈希算法·散列表
青山木1 小时前
Hot 100 ---腐烂的橘子
java·数据结构·后端·算法·leetcode·广度优先
未来之窗软件服务1 小时前
计算机考试-快速排序—东方仙盟
数据结构·算法·排序算法·仙盟创梦ide·东方仙盟
小龙报2 小时前
【优选算法】1. 水果成蓝 2.找到字符串中所有字母的异位词
java·c语言·数据结构·数据库·c++·redis·算法
txzrxz2 小时前
数论:排列数、组合数、费马小定理、逆元、同余定理
c++·算法·数论·组合数·费马小定理·逆元·排列数
xqqxqxxq2 小时前
LeetCode Hot100 双指针专项题解笔记
笔记·算法·leetcode
闪电悠米3 小时前
力扣hot100-54.螺旋矩阵-模拟边界控制详解
算法·leetcode·矩阵
变量未定义~3 小时前
虚拟节点-星石传送阵(4星)、强连通分量
数据结构·算法
IT方大同3 小时前
C语言分支与循环语句
c语言·开发语言·算法
待磨的钝刨4 小时前
深入理解主成分分析(PCA)
人工智能·线性代数·算法·机器学习