数组基操三连(1)

举报
兔老大 发表于 2021/04/26 00:57:15 2021/04/26
【摘要】 题目:     给定一个数组arr,求出需要排序的最短子数组长度 要求:     时间o(n),空间o(1) 思路:     有序的数组中,任意一个数字,一定小于左边的数大于右边的数。     我们找到的需要排序的子数组,显然是比右边最小的值大,或比左边最大的值小。   &...

题目:

    给定一个数组arr,求出需要排序的最短子数组长度

要求:

    时间o(n),空间o(1)

思路:

    有序的数组中,任意一个数字,一定小于左边的数大于右边的数。

    我们找到的需要排序的子数组,显然是比右边最小的值大,或比左边最大的值小。

    我们初始化变量noMinindex=-1;从右往左遍历,记录经过的最小值为min,若当前数大于min,说明,如果要有序,min一定要放      在当前数左边,我们更新noMinindex。

    也就是说,我们的noMinindex是负责记录最左边出现这种情况的位置。我们反方向处理出noMaxindex

    他们组成的区间就是最短需要排序的部分了


  
  1. public class MinLengthForSort {
  2. public static int getMinLength(int[] arr) {
  3. if (arr == null || arr.length < 2) {
  4. return 0;
  5. }
  6. int min = arr[arr.length - 1];
  7. int noMinIndex = -1;
  8. for (int i = arr.length - 2; i != -1; i--) {
  9. if (arr[i] > min) {
  10. noMinIndex = i;
  11. } else {
  12. min = Math.min(min, arr[i]);
  13. }
  14. }
  15. if (noMinIndex == -1) {
  16. return 0;
  17. }
  18. int max = arr[0];
  19. int noMaxIndex = -1;
  20. for (int i = 1; i != arr.length; i++) {
  21. if (arr[i] < max) {
  22. noMaxIndex = i;
  23. } else {
  24. max = Math.max(max, arr[i]);
  25. }
  26. }
  27. return noMaxIndex - noMinIndex + 1;
  28. }
  29. public static void main(String[] args) {
  30. int[] arr = { 1, 2, 4, 7, 10, 11, 7, 12, 6, 7, 16, 18, 19 };
  31. System.out.println(getMinLength(arr));
  32. }
  33. }

 

题目:

    给定一个数组,找出出现次数超过一半的数字

蠢思路:排序找中间

思路:

    DP:扫一遍一个变量count记录解出现的次数,是当前解就++,否则--,count为负就换掉当前解。(解释:想象解全都挨在         一起(前面),count先达到最大,然后减为1或0,而其他数字先出现,可能会使正确解的count减为负数,但都会使正确解        在后面更多,从而保证了结束时肯定为正确解)


  
  1. int main()
  2. {
  3. int n;//个数
  4. scanf("%d",&n);
  5. int temp,k,count=0;
  6. while(n--)
  7. {
  8. scanf("%d",&temp);
  9. if(temp==k)count++;
  10. else
  11. {
  12. count--;
  13. if(count<0){count=0;k=temp;}
  14. }
  15. }
  16. printf("%d\n",k);
  17. }

 

 

题目:

给定一个有N×M的整型矩阵matrix和一个整数K,matrix的每一行和每一列都是排好序的。实现一个函数,判断K是否在matrix中。

例如:

0       1       2       5

2       3       4       7

4       4       4       8

5       7       7       9

如果K为7,返回true,如果K为6,返回false

要求:

时间复杂度为O(N+M),额外空间复杂度为O(1)。

思路:

1.从矩阵最右上角的数开始寻找(row=0,col=M-1)。

2.比较当前数matrix[row][col]与K的关系:

如果与K相等,说明已找到,直接返回true

如果比K大,因为矩阵每一列都已排好序,所以在当前数所在的列中,处于当前数下方的数都会比K大,则没有必要继续在第col列上寻找,令col=col-1,重复步骤2.

如果比K小,因为矩阵每一行都已排好序,所以在当前数所在的行中,处于当前数左方的数都会比K小,则没有必要继续在第row行上寻找,令row=row+1,重复步骤2.

3.如果找到越界都没有发现与K相等的数,则返回false。

或者可以从矩阵的最左下角的数开始寻找(row=N-1,col=0),具体过程类似。

代码:
 


  
  1. /**
  2.  * 在行列都排好序的矩阵中找数
  3.  */
  4. public class IsContains {
  5.     public boolean isContains(int[][] matrix, int K) {
  6.         int row = 0;
  7.         int col = matrix[0].length - 1;
  8.         while (row < matrix.length && col > -1) {
  9.             if (matrix[row][col] == K) {
  10.                 return true;
  11.             } else if (matrix[row][col] > K) {
  12.                 col--;
  13.             } else {
  14.                 row++;
  15.             }
  16.         }
  17.         return false;
  18.     }
  19. }

 

文章来源: fantianzuo.blog.csdn.net,作者:兔老大RabbitMQ,版权归原作者所有,如需转载,请联系作者。

原文链接:fantianzuo.blog.csdn.net/article/details/90270402

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。