数组基操三连(4)

举报
兔老大 发表于 2021/04/28 00:06:43 2021/04/28
【摘要】 题目一 给定一个长度为N的整型数组arr,其中有N个互不相等的自然数1~N 请实现arr的排序 但是不要把下标0~N-1位置上的数值通过直接赋值的方式替换成1~N。 要求:时间复杂度为O(N),额外空间复杂度为O(1)。   思路:从左向右检查,检查到需要换的以后,就直接把它放到该去的位置,然后被换掉的数,位置肯定也不对,继续重复相同的方法,最后肯定会跳...

题目一

给定一个长度为N的整型数组arr,其中有N个互不相等的自然数1~N

请实现arr的排序

但是不要把下标0~N-1位置上的数值通过直接赋值的方式替换成1~N。

要求:时间复杂度为O(N),额外空间复杂度为O(1)。

 

思路:从左向右检查,检查到需要换的以后,就直接把它放到该去的位置,然后被换掉的数,位置肯定也不对,继续重复相同的方法,最后肯定会跳回来(原因懒得说了自己想想),然后继续往下检查即可。


  
  1. public static void sort1(int[] arr) {
  2. int tmp = 0;
  3. int next = 0;
  4. for (int i = 0; i != arr.length; i++) {
  5. tmp = arr[i];
  6. while (arr[i] != i + 1) {
  7. next = arr[tmp - 1];
  8. arr[tmp - 1] = tmp;
  9. tmp = next;
  10. }
  11. }
  12. }

题目二

本题一般思路:依次查找找到比前后都小的数;或者选出最小数,他肯定是局部最小的;等等

但这些都是O(n)的方法,而用二分可以做到O(logn).

二分思路:

  考虑最左和最右的元素:如果arr[0]<arr[1]  return 0; arr[N-1]<arr[N-2] return N-1;

   考虑最中间元素,如果中间元素大于它左边的元素,那么局部最小值就应该在数组的左半部分

   如果中间元素小于大于它右边的元素,那么局部最小值就应该在数组的右半部分

   中间元素既小于它左边的值又小于它右边的值,那么它就是局部最小
 

题目三

 

给定一个整数数组arr,返回不包含本位置的累乘数组。

比如2 3 1 4返回12 8 24 6

方法一:算出所有数的乘积,每个位置除以自己即可。要注意坑:如果数组中有一个0,那么0这个位置就是其他数的乘积,其他位置全为0;如果有多个0,那么所有位置都是0.


  
  1. public int[] product1(int[] arr) {
  2. if(arr==null || arr.length<2) {
  3. return null;
  4. }
  5. int count=0;//0的个数
  6. int all=1;//除0以外的数的乘积
  7. for(int i=0;i!=arr.length;i++) {
  8. if(arr[i]!=0) {
  9. all*=arr[i];
  10. }else {
  11. count++;
  12. }
  13. }
  14. int[] res=new int[arr.length];
  15. if(count==0) {
  16. for(int i=0;i!=arr.length;i++) {
  17. res[i]=all/res[i];
  18. }
  19. }else if(count==1) {
  20. for(int i=0;i!=arr.length;i++) {
  21. if(arr[i]==0) {
  22. res[i]=all;
  23. }
  24. }
  25. }
  26. return res;
  27. }

 

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

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

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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