Saturday, September 23, 2017

Codility - Lesson 10 Prime and composite numbers - 1. MinPerimeterRectangle

Source Link:
https://codility.com/programmers/lessons/10-prime_and_composite_numbers/min_perimeter_rectangle/

Question:
An integer N is given, representing the area of some rectangle.
The area of a rectangle whose sides are of length A and B is A * B, and the perimeter is 2 * (A + B).
The goal is to find the minimal perimeter of any rectangle whose area equals N. The sides of this rectangle should be only integers.

For example, given integer N = 30, rectangles of area 30 are:
  • (1, 30), with a perimeter of 62,
  • (2, 15), with a perimeter of 34,
  • (3, 10), with a perimeter of 26,
  • (5, 6), with a perimeter of 22.
Write a function: 

class Solution { public int solution(int N); }

that, given an integer N, returns the minimal perimeter of any rectangle whose area is exactly equal to N.

For example, given an integer N = 30, the function should return 22, as explained above.

Assume that:
  • N is an integer within the range [1..1,000,000,000].
Complexity:
  • expected worst-case time complexity is O(sqrt(N));
  • expected worst-case space complexity is O(1).

My Solution:
Notes:
1. main idea:
// try to find the one "closest to sqrt(N)"
int sqrtN = (int) Math.sqrt(N);
int perimeter = (1 * 2) + (N * 2); // perimeter = (A*2)+(B*2) 
2. from the one closest to sqrt(N)
for(int i = sqrtN; i > 0; i--){
if( N % i ==0){ // key point: "N % i ==0"
int A = i;
int B = N/i;
perimeter = (A * 2) + (B * 2);
break; // be careful: break from the for-loop
}
}
return perimeter;  

No comments:

Post a Comment

Codility - Lesson 16 Greedy algorithms - 2. MaxNonoverlappingSegments

Source Link: https://app.codility.com/programmers/lessons/16-greedy_algorithms/max_nonoverlapping_segments/ Question: Located on a line ...