力扣hot100做题整理91-100

1.只出现一次的数字

异或"相同为0,不同为1

java 复制代码
class Solution {
    public int singleNumber(int[] nums) {
        // 两个相同,异或后为0
        int res = 0;
        for (int i = 0; i < nums.length; i++) {
            res  = res ^ nums[i];
        }
        return res;
    }
}

2.多数元素

采用摩尔投票的方式

或者采用hash表

java 复制代码
class Solution {
    public int majorityElement(int[] nums) {
        // 摩尔投票
        int res = 0;
        int count = 0;
        for (int num : nums) {
            if (count == 0) {
                res = num;
            }
            if (num == res) {
                count++;
            } else {
                count--;
            }
        }
        return res;
    }
}

3.颜色分类

遍历两边数组,统计

java 复制代码
class Solution {
    public void sortColors(int[] nums) {
        int[] count = new int[3];
        for (int num : nums) {
            count[num]++;
        }
        int index = 0;
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < count[i]; j++) {
                nums[index++] = i;
            }
        }

    }
}

4.寻找重复数

直接排序找

java 复制代码
class Solution {
    public int findDuplicate(int[] nums) {
       Arrays.sort(nums);
       for (int i = 0; i < nums.length-1; i++) {
            if(nums[i] == nums[i+1]) {
                return nums[i];
            }
       }
       return 0;
    }
}

5.下一个排列

1.从后往前遍历,第一个递减的排序,记录左边元素a

2.从后往前遍历,找到第一个大于记录的左边元素为b

3.交换a和b

4.a右边的元素全部逆序

java 复制代码
class Solution {
    public void nextPermutation(int[] nums) {
        // 1.从后往前找出第一个升序对(i,j) nums[i] < nums[j] 123465  a[i] = 4 a[j] = 6
        int a = -1;
        for (int i = nums.length-1; i > 0; i--) {
            if (nums[i-1] < nums[i]) {
                a = i-1;
                break;
            }
        }
        if (a == -1) {
            int left = 0, right = nums.length-1;
            while (left <= right) {
                int temp = nums[left];
                nums[left] = nums[right];
                nums[right] = temp;
                left++;
                right--;
            }
            return;
        }
        // 2.从后往前找第一个比a[i]大的元素,并交换位置
        for (int i = nums.length-1; i >= 0; i--) {
            if (nums[i] > nums[a]) {
               int temp = nums[i];
               nums[i] = nums[a];
               nums[a] = temp;
               break;
            }
        }

        // 3.a[j]及后面的元素逆序
        int left = a+1, right = nums.length-1;
        while (left <= right) {
            int temp = nums[left];
            nums[left] = nums[right];
            nums[right] = temp;
            left++;
            right--;
        }

    }
}
相关推荐
君君思密达8 分钟前
LeetCode Hot 100 题目详解-滑动窗口
算法·leetcode·职场和发展
GreenTea8 小时前
深度解读 Anthropic 多智能体报告:更强的模型 ≠ 更好的协调
前端·后端·算法
fqq39 小时前
力扣刷题前置Java语法
算法·leetcode·职场和发展
半夏微凉半夏殇12 小时前
x11与weston对比,优先选哪个
leetcode·均值算法·eclipse
2501_9065651212 小时前
数学之美探究
算法
oier_Asad.Chen12 小时前
【洛谷题解/AcWing题解/OI学习笔记】洛谷P2868【USACO07DEC】Sightseeing Cows G(01分数规划求最大比率)
算法·图论·spfa·二分·负环
leisoo809714 小时前
财报数据怎么排雷本地化Python构建财务异常预警系统
人工智能·python·算法
luj_176816 小时前
塔防牌:策略与卡牌的智慧碰撞
服务器·c语言·开发语言·经验分享·算法
wuyk55516 小时前
3.链表:用指针串联的动态数据结构
c语言·开发语言·数据结构·链表
郝学胜-神的一滴16 小时前
干货版《算法导论》17:二叉树核心原理、遍历逻辑与高阶实操全解
数据结构·c++·python·算法·计算机·编程