You are not logged in. Please login at to post your questions!


RAINBOWA - Editorial



Author: Dmytro Berezin
Primary Tester Prateek Gupta
Editorialist: Hussain Kara Fallah


A rainbow array of n elements follows the form

{ 1 (repeated a1 times), 2 (a2 times), 3 (a3 times), 4 (a4 times), 5 (a5 times), 6 (a6 times), 7 (a7 times), 6 (a6 times), 5 (a5 times), 4 (a4 times), 3 (a3 times), 2 (a2 times), 1 (a1 times) }

$2*(a_1+a_2+a_3+a_4+a_5+a_6)+a_7 = n$

Given an array consisting of n elements, check if it's a rainbow array or not.






This problem is similar to checking if a given string is a palindrome or not. The simplest and most effective way to check if the array is rainbow, is by maintaining 2 pointers one iterating through elements starting from the beginning of our array, and the other one iterating through the elements in the reversed direction.

Both of the first and the last element of the array must be ones. In fact, there must be two blocks consisting of the same number of consecutive ones (1) one of them located at the beginning of the array, and the other one at the end.

Figuring out the number of consecutive ones at the beginning of our array can be done easily by moving our first pointer forward, and stopping when encountering a number not equal to 1 or reaching the end of our array. We can do the same on the other side by moving our second pointer backwards. After that, we should check that we had processed the same number of ones on both sides.

After processing elements equal to one, you can observe that we are still solving the same problem (in fact, it's a subproblem now). Both of our pointers must be referring to elements equal to 2. Moving our pointers is equivalent to dropping elements, so if we consider that we have dropped processed ones, there must be two blocks consisting of the same number of consecutive twos (2) one of them located at the beginning of the array, and the other one at the end. Of course instead of using 2 pointers, maintaining a data structure which supports dropping elements from both ends of the array (Like C++ Deque) does the job perfectly.

After repeating the same procedure for {1,2,3,4,5,6} (considering that none of our conditions was violated, in case that happened we can report that our array is not rainbow and break) we would be finishing with a single block consisting only of elements equal to seven 7. Reaching this point confirms that our array is rainbow.

You can check my implementation for better understanding.


AUTHOR's solution: Can be found here
TESTER's solution: Can be found here
EDITORIALIST's solution: Can be found here

This question is marked "community wiki".

asked 11 Aug, 13:32

deadwing97's gravatar image

accept rate: 0%

edited 18 Aug, 15:21

admin's gravatar image

0★admin ♦♦

What Will be Answer for


1 2 3 4 5 6 6 7 6 7 6 6 5 4 3 2 1 ??


answered 20 Aug, 19:41

chunky_2808's gravatar image

accept rate: 0%

Not a rainbow array. "767" not allowed.

(20 Aug, 19:50) vijju123 ♦5★

it would be "no"

(20 Aug, 19:51) sandeep_0074★

Exactly !! Here is Link to my AC solution Which gives Yes for above testcase.

(20 Aug, 19:53) chunky_28084★

Were test cases for RAINBOWA Weak?

(20 Aug, 19:55) chunky_28084★

Update : Link is updated

Can someone point out the mistake? Code commented. Shameful cant do cakewalk

Logic : 1)Store half array 2)Subtract the incoming elements accordingly, so the resulting array should be consisting of all zeroes 3)Plus other conditions checked 4)still wa :(


answered 21 Aug, 09:30

ab9999's gravatar image

accept rate: 0%

edited 22 Aug, 06:04

Access denied! You don't have permissions for this page.

(21 Aug, 20:52) eugalt3★

this is my link can anyone point out which test case is not working

Logic: 1)half the array itterate by for loop check only the differnce 2)remaining half itterated by another for loop and continuing the array elements by there index

can anyone explain this test case => 1 1 1 2 2 3 3 3 3 2 2 1 1 is this "yes" or "no" for this


answered 31 Aug, 20:45

nishugu2's gravatar image

accept rate: 0%

edited 01 Sep, 02:02

the above test case 1 1 1 2 2 3 3 3 3 2 2 1 1 is not a rainbow array because rainbow array should go until it hits 7 and it should have all 1 2 3 4 5 6 7 without a skip over value.(1 2 4 5 6 7 6 5 4 2 1)(this is not a rainbow array) (1 2 3 4 5 6 7 6 7 6 5 4 3 2 1 ) (this is also not a rainbow array either).

(01 Sep, 02:14) kunnu1202★

thanks bro for giving me some good explaination of test cases can you plz tell me about this case 1 2 3 4 5 6 7 7 6 5 4 3 2 1 and its length is 14 is it "Yes" or "No"

(01 Sep, 11:49) nishugu22★

Can any one point out why my code is not working, I to my knowledge have covered every cases. link:

which case i am missing?


answered 08 Sep, 00:54

rahulsinghk's gravatar image

accept rate: 0% please tell me what is wrong in this code?


answered 17 Sep, 12:34

chhetriakash26's gravatar image

accept rate: 0%

The question is incomplete, at least frame it correctly.At the beginning, i thought only numbers from 1-7 are allowed, also even this that 7 cannot repeat more than once! The question should be unambiguous. :( wasted almost 2 hours.

This answer is marked "community wiki".

answered 11 Oct, 16:14

llgokull_007's gravatar image

accept rate: 0% .. this code gives correct answer for sample test cases. can someone point out what's wrong with my code?


answered yesterday

ankush24's gravatar image

accept rate: 0%

edited yesterday

toggle preview

Follow this question

By Email:

Once you sign in you will be able to subscribe for any updates here



Answers and Comments

Markdown Basics

  • *italic* or _italic_
  • **bold** or __bold__
  • link:[text]( "title")
  • image?![alt text](/path/img.jpg "title")
  • numbered list: 1. Foo 2. Bar
  • to add a line break simply add two spaces to where you would like the new line to be.
  • basic HTML tags are also supported
  • mathemetical formulas in Latex between $ symbol

Question tags:


question asked: 11 Aug, 13:32

question was seen: 1,862 times

last updated: yesterday