您当前的位置: 首页 >  算法

庄小焱

暂无认证

  • 2浏览

    0关注

    805博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

算法问题——(查找问题2)

庄小焱 发布时间:2020-07-10 11:16:32 ,浏览量:2

一个不含有负数的数组可以代表一圈环形山,每个位置的值代表山的高度。比如,{3,1,2,4,5},{4,5,3,1,2}或{1,2,4,5,3}都代表同样结构的环形山。3->1->2->4->5->3 方向叫作 next 方向(逆时针),3->5->4->2->1->3 方向叫作 last 方向(顺时针)。

山峰 A 和 山峰 B 能够相互看见的条件为:

1. 如果 A 和 B 是同一座山,认为不能相互看见。

2. 如果 A 和 B 是不同的山,并且在环中相邻,认为可以相互看见。

3. 如果 A 和 B 是不同的山,并且在环中不相邻,假设两座山高度的最小值为 min。如果 A 通过 next 方向到 B 的途中没有高度比 min 大的山峰,或者 A 通过 last 方向到 B 的途中没有高度比 min 大的山峰,认为 A 和 B 可以相互看见。

问题如下:给定一个不含有负数且没有重复值的数组 arr,请问有多少对山峰能够相互看见? 

 

题目描述

N个加油站组成一个环形,给定两个长度都是N的非负数组oil和dis(N>1),oil[i]代表第i个加油站存的油可以跑多少千米,dis[i]代表第i个加油站到环中下一个加油站相隔多少千米。假设你有一辆油箱足够大的车,初始时车里没有油。如果车从第i个加油站出发,最终可以回到这个加油站,那么第i个加油站就算良好出发点,否则就不算。请返回长度为N的boolean型数组res,res[i]代表第i个加油站是不是良好出发点

规定只能按照顺时针走,也就是i只能走到i+1,N只能走到1

[要求]

时间复杂度为O(n)O(n)O(n),空间复杂度为O(1)O(1)O(1)


import java.util.Scanner;

public class Main4 {
    public static void main(String[] args) {
        //输入的数据
        Scanner sc = new Scanner(System.in);
        int m = sc.nextInt();

        int[] array1 = new int[m];
        int[] array2 = new int[m];

        for (int i = 0; i < m; i++) {
            array1[i] = sc.nextInt();
        }
        for (int i = 0; i < m; i++) {
            array2[i] = sc.nextInt();
        }
        //调用函数
        int[] result = test(array1, array2);

        //输出结果
        for (int val : result) {
            System.out.print(val + " ");
        }
    }


    //通过率只有30%
    private static int[] test(int[] array1, int[] array2) {
        //结果
        int[] result = new int[array1.length];

        int[] nums1 = new int[array1.length * 2];
        int[] nums2 = new int[array1.length * 2];

        for (int i = 0; i < array1.length; i++) {
            nums1[i] = array1[i];
            nums1[i + array1.length] = array1[i];
        }

        for (int i = 0; i < array2.length; i++) {
            nums2[i] = array2[i];
            nums2[i + array2.length] = array2[i];
        }

        //开始遍历
        for (int i = 0; i < nums1.length / 2; i++) {
            int flag = 0;
            int sum = 0;
            for (int j = i; j < i + nums2.length / 2; j++) {
                if (sum + nums1[j] - nums2[j] < 0) {
                    flag = 1;
                    break;
                } else {
                    sum = sum + nums1[j] - nums2[j];
                }
            }
            if (flag == 1) {
                result[i] = 0;
            } else {
                result[i] = 1;
            }
        }
        return result;
    }
}
题目描述

一个栈中元素的类型为整型,现在想将该栈从顶到底按从大到小的顺序排序,只许申请一个栈。除此之外,可以申请新的变量,但不能申请额外的数据结构。如何完成排序?

 

/**
 * Copyright (C), 2018-2020
 * FileName: Main11
 * Author:   xjl
 * Date:     2020/7/12 13:06
 * Description: 测试的工作
 */
package Search;

import java.util.Collections;
import java.util.Comparator;
import java.util.Scanner;
import java.util.Stack;

public class Main11 {

    public static void main(String[] args) {
        //输入
        Scanner sc = new Scanner(System.in);
        int m = sc.nextInt();

        Stack stack = new Stack();
        for (int i = 0; i < m; i++) {
            stack.add(sc.nextInt());
        }
        //调用
        Collections.sort(stack, new Comparator() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o2-o1;
            }
        });

        //输出
        for (int V : stack) {
            System.out.print(V+" ");
        }
    }
}

给定一个长度为N的整形数组arr,其中有N个互不相等的自然数1-N。请实现arr的排序,但是不要把下标0∼N−10 \sim N-10∼N−1位置上的数通过直接赋值的方式替换成1∼N1 \sim N1∼N

[要求]:  时间复杂度为O(n),空间复杂度为O(1) 

import java.util.*;

public class Main{

    public static void main(String[] args) {
        //输入
        Scanner sc = new Scanner(System.in);
        int m = sc.nextInt();

        int[] array = new int[m];
        for (int i = 0; i < m; i++) {
            array[i] = sc.nextInt();
        }
        //函数
        Arrays.sort(array);
        //结果
        for (int V : array) {
            System.out.print(V + " ");
        }
    }
}

给定一个有序数组arr,调整arr使得这个数组的左半部分[1,n+12][1, \frac{n+1}{2}][1,2n+1​]没有重复元素且升序,而不用保证右部分是否有序

例如,arr = [1, 2, 2, 2, 3, 3, 4, 5, 6, 6, 7, 7, 8, 8, 8, 9],调整之后arr=[1, 2, 3, 4, 5, 6, 7, 8, 9, .....]。

[要求]   时间复杂度为O(n),空间复杂度为O(1)。

/**
 * Copyright (C), 2018-2020
 * FileName: Main13
 * Author:   xjl
 * Date:     2020/7/12 13:37
 * Description: 数组的调整
 */
package Search;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;

public class Main13 {

    public static void main(String[] args) {
        //输入
        Scanner sc = new Scanner(System.in);
        int m = sc.nextInt();
        int[] array = new int[m];

        for (int i = 0; i < m; i++) {
            array[i] = sc.nextInt();
        }
        //调用
        int[] result = test1(array);
        //结果
        for (int i : result) {
            System.out.print(i + " ");
        }
    }

    private static int[] test(int[] array) {
        int[] result = new int[array.length];

        List list1 = new ArrayList();
        List list2 = new ArrayList();

        for (int i = 0; i < array.length; i++) {
            if (!list1.contains(array[i])) {
                list1.add(array[i]);
            } else {
                list2.add(array[i]);
            }
        }
        Collections.sort(list1);
        for (int V : list2) {
            list1.add(V);
        }
        int index = 0;
        for (int V : list1) {
            result[index++] = V;
        }
        return result;
    }

    private static int[] test1(int[] array) {
        for (int i = 1; i  array[i - 1]) {
                continue;
            } else {
                for (int j = i + 1; j < array.length; j++) {
                    if (array[j] > array[i] && array[j] > array[i - 1]) {
                        int temp = array[i];
                        array[i] = array[j];
                        array[j] = temp;
                        break;
                    }
                }
            }
        }
        return array;
    }
}

 给定一个无序数组arr,求出需要排序的最短子数组的长度,对子数组排序后能使得整个数组有序,即为需要排序的数组。例如:arr=[1,5,3,4,2,6,7]返回4,因为只有[5,3,4,2]需要排序。

/**
 * Copyright (C), 2018-2020
 * FileName: Main4
 * Author:   xjl
 * Date:     2020/7/13 19:47
 * Description: 排序算法
 */
package Sort;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class Main4 {
    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String[] str = reader.readLine().split(" ");
        int len = Integer.valueOf(str[0]);
        String[] arrStr = reader.readLine().split(" ");
        int[] arr = new int[arrStr.length];
        for(int i=0; i min) left = j;
        }
        return right - left + 1;
    }
}

 

 

 

 

 

 

关注
打赏
1657692713
查看更多评论
立即登录/注册

微信扫码登录

0.1171s