力扣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--;
        }

    }
}
相关推荐
wangjialelele7 分钟前
平衡二叉搜索树:AVL树和红黑树
java·c语言·开发语言·数据结构·c++·算法·深度优先
xuxie9910 分钟前
day 21 双向链表以及循环链表
数据结构·链表
驱动探索者24 分钟前
linux mailbox 学习
linux·学习·算法
ringking12326 分钟前
autoware-1:安装环境cuda/cudnn/tensorRT库函数的判断
人工智能·算法·机器学习
大闲在人1 小时前
8. 供应链与制造过程术语:产能
算法·制造·供应链管理·智能制造·工业工程
一只小小的芙厨1 小时前
寒假集训笔记·以点为对象的树形DP
c++·算法
历程里程碑1 小时前
普通数组----合并区间
java·数据结构·python·算法·leetcode·职场和发展·tornado
执风挽^1 小时前
Python基础编程题2
开发语言·python·算法·visual studio code
Z9fish2 小时前
sse哈工大C语言编程练习20
c语言·开发语言·算法
晓13132 小时前
第六章 【C语言篇:结构体&位运算】 结构体、位运算全面解析
c语言·算法