• 暑期2022.08算法讲解


    题目 LeetCode15
    给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。

    输入:nums = [-1,0,1,2,-1,-4]
    输出:[[-1,-1,2],[-1,0,1]]

    解题思路
    思路1:暴力求解,3 层循环。时间复杂度 O(nnn)
    思路2:2 层循环,第 1 层循环遍历数组,作为 target,第二层循环参考两数求和的逻辑。

    思路3:先排序后查找,时间复杂度 O(n*n)

    1. class Solution {
    2. public static List<List<Integer>> threeSum(int[] nums) {
    3. List<List<Integer>> list = new ArrayList();
    4. int len = nums.length;
    5. if(nums == null || len < 3) return list;
    6. Arrays.sort(nums); // 排序
    7. for (int i = 0; i < len ; i++) {
    8. if(nums[i] > 0) break; // 如果当前数字大于0,则三数之和一定大于0,所以结束循环
    9. if(i > 0 && nums[i] == nums[i-1]) continue; // 则说明该数字重复,会导致结果重复,所以应该跳过
    10. int L = i+1;//指针从第二个数开始移动
    11. int R = len-1;
    12. while(L < R){
    13. int sum = nums[i] + nums[L] + nums[R];
    14. if(sum == 0){
    15. list.add(Arrays.asList(nums[i],nums[L],nums[R]));
    16. while (L<R && nums[L] == nums[L+1]) L++; // 则会导致结果重复,应该跳过
    17. while (L<R && nums[R] == nums[R-1]) R--; // 则会导致结果重复,应该跳过
    18. L++;
    19. R--;
    20. }
    21. else if (sum < 0) L++;
    22. else if (sum > 0) R--;
    23. }
    24. }
    25. return list;
    26. }
    27. }

    求数组的第K小数字 

    求数组的第k小,数字数量非常多。

    Input

    每组数据给出n m k表示有n个数,求第k小,数组的数字由以下规则得到:

    ai = mi mod  (109+7), i = 1, 2, ..., n

    其中 1 ≤ n, m ≤ 5 × 107, 1 ≤ k ≤ n,数据保证得到的数组元素大部分互不相等。

    Output

    输出第k小的数

    Sample Input

    3 2 2

    Sample Output

    4

    Hint

    先复习下快速排序的实现

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. const int mod = 1e9 + 7;
    9. const int maxn = 1e8 + 10;
    10. int n, m, k;
    11. int a[maxn];
    12. int GetK(int left, int right, int k)
    13. {
    14. if(left == right - 1) return a[left];
    15. int low = left, high = right - 1, center = a[low];
    16. while(low < high)
    17. {
    18. while(low < high && a[high] >= center) high --;
    19. a[low] = a[high];
    20. while(low < high && a[low] <= center) low ++;
    21. a[high] = a[low];
    22. }
    23. a[low] = center;
    24. if(low - left >= k) return GetK(left, low, k);
    25. else if(low - left + 1 == k) return a[low];
    26. else return GetK(low + 1, right, k - (low - left) - 1);
    27. }
    28. int main()
    29. {
    30. while(scanf("%d%d%d", &n, &m, &k) != EOF)
    31. {
    32. a[0] = m;
    33. for(int i = 1; i < n; i ++)
    34. a[i] = 1LL * a[i - 1] * m % mod;
    35. printf("%d\n", GetK(0, n, k));
    36. }
    37. return 0;
    38. }


    3题目:

    给你一个混合字符串 s ,请你返回 s 中 第二大 的数字,如果不存在第二大的数字,请你返回 -1 。

    混合字符串 由小写英文字母和数字组成。

    示例 1:

    输入:s = "dfa12321afd"
    输出:2
    解释:出现在 s 中的数字包括 [1, 2, 3] 。第二大的数字是 2 。
    示例 2:

    输入:s = "abc1111"
    输出:-1
    解释:出现在 s 中的数字只包含 [1] 。没有第二大的数字。

    提示:

    1 <= s.length <= 500
    s 只包含小写英文字母和(或)数字。

    思路:

    此题比较简单,直接遍历,用两个变量记录第1大和第2大的数即可。

  • 相关阅读:
    队列的实现(c语言)
    java从键盘输入Scanner
    物联网电气融合实训室建设方案
    1x1卷积的作用
    选择困难?我如何实现可道云KODBOX与KODEXPLORE共存。
    提升文件上传性能的 4 种方式,你会吗?
    TCP协议
    什么是希尔排序?
    Winform 自动升级程序
    【PL理论】(3) F# 数据类型:变量类型 | F# 操作符 | 定义函数 | 使用定义的函数 | if-then-else 表达式:绝对不能省略 else 部分,除非表达式是 unit 类型
  • 原文地址:https://blog.csdn.net/wjw7869/article/details/126108682