Larry's Array 解题思路及过程

先甩链接https://www.hackerrank.com/challenges/larrys-array

首先想到的一个思路是:从数列中找最小值并确定最小值的位置

1. 如果最小值的位置在数列的第一位,则在1..n中继续找次小值所在的位置(可以理解为移除首位的最小值,然后在剩余数列中寻找最小值);

2. 如果最小值的位置在数列的第二位,则选取0..3三个数组成子数列进行一次轮转将最小值移至首位

3. 如果最小值的位置在数列的第二位之后,则选取最小值之前的两个数与最小值一起组成子数列进行两次轮转将最小值移至子数列的第一位,然后继续循环进行操作

4. 当剩余数列的长度不足3时,退出循环,并核对结果数列是否是升序排序,是输出YES,否输出NO

题目的输入条件:

第一行:测试案例的数量

第二行:数列的数字个数

第三行:数列的各个数字,使用一个空格进行分隔

实现代码如下:

 1 # 轮转3个数的列表 0<-1, 1<-2, 2<-0
 2 def rotate(p_arr_sub):
 3     arr_sub_r = p_arr_sub
 4     temp = arr_sub_r[0]
 5     arr_sub_r[0] = arr_sub_r[1]
 6     arr_sub_r[1] = arr_sub_r[2]
 7     arr_sub_r[2] = temp
 8     return arr_sub_r
 9
10 t = int(input().strip())
11
12 for a0 in range(t):
13     n = int(input().strip())
14     arr = [int(arr_temp) for arr_temp in input().strip().split(‘ ‘)]
15
16     # 列表的起点序号
17     begin_index = 0
18
19     while begin_index < n - 2:
20         # 获取最小值在列表中的位置序号
21         min_value_index = arr.index(min(arr[begin_index:]))
22         # 最小值位置序号与列表起点相同, 则说明无需进行轮转
23         # 列表起点位置后移一位
24         if min_value_index == begin_index:
25             begin_index += 1
26         # 最小值位置在起点序号之后一位, 则需要进行一次轮转
27         elif min_value_index == begin_index + 1:
28             arr_sub = rotate(arr[begin_index:begin_index+3])
29             arr[begin_index:begin_index + 3] = arr_sub
30         # 最小值位置在起点序号之后两位以上, 则获取最小值之前的两位与最小值一起构成一个长度为3的子列表进行两次轮转
31         else:
32             arr_sub = rotate(rotate(arr[min_value_index-2:min_value_index+1]))
33             arr[min_value_index-2:min_value_index+1] = arr_sub
34
35     if sorted(arr) == arr:
36         print("YES")
37     else:
38         print("NO")

获得结果如下:

一共20个测试案例前10个都正常通过,后10个全部超时,拿到最后一个案例的输入与期望输出在本地进行测试后发现结果是正确的,所以剩下的事情就是如何进行效率的优化。

重新分析了一下题目,输出要求是YES or NO,所以并不一定需要进行实际的轮转操作,参照https://en.wikipedia.org/wiki/Parity_of_a_permutation的思路最终的解决代码如下:

 1 t = int(input().strip())
 2
 3 for a0 in range(t):
 4     n = int(input().strip())
 5     arr = [int(arr_temp) for arr_temp in input().strip().split(‘ ‘)]
 6
 7     inversions = 0
 8     for i in range(n-1):
 9         for j in range(i+1, n):
10             if arr[i] > arr[j]:
11                 inversions += 1
12
13     if inversions % 2 == 0:
14         print("YES")
15     else:
16         print("NO")

Larry's Array 解题思路及过程

时间: 2024-10-11 08:08:27

Larry's Array 解题思路及过程的相关文章

Leetcode 34 Find First and Last Position of Element in Sorted Array 解题思路 (python)

本人编程小白,如果有写的不对.或者能更完善的地方请个位批评指正! 这个是leetcode的第34题,这道题的tag是数组,需要用到二分搜索法来解答 34. Find First and Last Position of Element in Sorted Array Given an array of integers nums sorted in ascending order, find the starting and ending position of a given target v

securityoverridehacking challenge 解题思路汇总——Advanced

继续上一篇securityoverridehacking challenge 解题思路汇总的工作,这次把Advanced给弄完了.这当中主要涉及到了关于php的一些攻击方法,可以以此为基础做一个深入的了解. 3      Advanced 3.1     PHP Sucks 利用PHP中==的跨类型比较而产生的漏洞.最终目的是要$input=="0000". 这个好办,php中,任何数字型字符串最终都会转化为数字去做比较,所以input可以是任意个0.不过Filter最后加了个正则判断

[LeetCode] 3Sum 解题思路

Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero. Note: Elements in a triplet (a,b,c) must be in non-descending order. (ie, a ≤ b ≤ c) The solut

[LeetCode] 53. Maximum Subarray 解题思路

Find the contiguous subarray within an array (containing at least one number) which has the largest sum. For example, given the array [-2,1,-3,4,-1,2,1,-5,4],the contiguous subarray [4,-1,2,1] has the largest sum = 6. 问题: 给定一个元素有正有负的数组,求最大连续子数组的和. 思路

[LeetCode] Maximum Gap 解题思路

Given an unsorted array, find the maximum difference between the successive elements in its sorted form. Try to solve it in linear time/space. Return 0 if the array contains less than 2 elements. You may assume all elements in the array are non-negat

[LeetCode] 234. Palindrome Linked List 解题思路

Given a singly linked list, determine if it is a palindrome. Follow up:Could you do it in O(n) time and O(1) space? 问题:给定一个单向列表结构,判断它是不是回文的. 补充:是否可以在 O(n) 时间,O(1) 额外空间下完成? 解题思路: 对于数组,判断是否是回文很好办,只需要用两个指针,从两端往中间扫一下就可以判定. 对于单向列表,首先想到的是,将列表复制一份到数组中,然后用上面

n皇后2种解题思路与代码-Java与C++实现

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:本文主要讲了n皇后问题的解题思路,并分别用java和c++实现了过程,最后,对于算法改进,使用了位运算. 一.问题抛出与初步解题思路 问题描述:八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行.纵行或斜线上. 转化规则:其实八皇后问题可以推广为更一般的n皇后

[LeetCode] Minimum Size Subarray Sum 解题思路

Given an array of n positive integers and a positive integer s, find the minimal length of a subarray of which the sum ≥ s. If there isn't one, return 0 instead. For example, given the array [2,3,1,2,4,3] and s = 7,the subarray [4,3] has the minimal

POJ 1095 Trees Made to Order 最详细的解题思路

题目来源:Trees Made to Order 题目大意:根据下面的规则给一棵二叉树编号: 规则1:如果二叉树为空,则编号为0: 规则2:如果二叉树只有一个节点,则编号为1: 规则3:所有含有m个节点的二叉树的编号小于所有含有m+1个节点的二叉树的编号: 规则4:如果一棵含有m个节点的二叉树(左子树为L,右子树为R)的编号为n,要想其它含有m个节点的二叉树的编号如果大于n,则需要满足两个条件中的任意一个:1.左子树的编号大于L的编号:2.左子树的编号等于L的编号,但是右子树的编号大于R的编号.