求给定数组右移动k位后的数组

来源:互联网 发布:数据库管理软件 编辑:程序博客网 时间:2024/04/29 03:30
3. 给定一个数组,输出这个数组中元素向右边移动K位的新数组,要求算法的时间复杂度是O(n),空间复杂度是O(1)
例如,数组array={1,2,3,4,5,6},其中元素向右边移动4位的新数组为{3,4,5,6,1,2}
solution:
数组旋转的算法有两种实现方式:一是使用一个额外的数组,用来写入移动后的元素。由于只需要通过遍历每个元素,
计算元素新的index,再写入新的数组中即可。所以算法的时间复杂度是和空间复杂度都是。
二是通过两步算法实现,先是逆序数组中全部的元素,然后在分别逆序前K个和后K个元素。注意,这只针对右移K位。如
过是向左移动K位,那么可以转化成向右移动array.length()-K位即可。而算法的时间复杂度是O(1)。
根据题目的要求,采用第二种处理方式,具体的代码如下所示:
public class question3 {
    
    void reverse(int[] array, int i, int j) {//实现逆序的reverse方法
        while (i < j) {
            int tmp = array[i];
            array[i] = array[j];
            array[j] = tmp;
            i++;
            j++;
        }
    }
    
    int[] toMoveRigthK(int[] array, int K) {
        if (array == null)
            return array;
        else {
            K %= array.length;//对K值进行处理,避免K大于数组长度,不便于下面的指标书写
            reverse(array,0,array.length);//逆序数组的全部元素
            reverse(array,0,K-1);//逆序前K个元素
            reverse(array,K,array.length-1);//逆序剩下的元素
            return array;
        }

    }


4. 给定一个数组,求这个数组中相差最大的两个元素的下标。要求算法时间复杂度是O(nlogn)。
例如array={2,6,9,0,7,3,1},那么这两个数的分别是9和0,他们的index是2和3,所以返回1
solution:
通过一个HashMap记录数组的元素值和index,再对数组进行排序,获取最大和最小的元素。最后通过
HashMap查找这两个元素在原数组中的index,计算差返回即可。实现的具体代码如下:
import java.util.HashMap;
import java.util.Arrays;

public class question4 {
      int indexDistance(int [] array){
          int dist=0;
          HashMap<Integer,Integer> hm=new HashMap<Integer,Integer>();
          for(int i=0;i<array.length;i++){
              hm.put(array[i], i);
          }
          Arrays.sort(array);//sort方法是Arrays中定义的升序排序
          dist=hm.get(array[array.length-1])-hm.get(array[0]);
          return dist;
      }
}


0 0
原创粉丝点击