【算法】Minimum Cuts to Divide a Circle 分割圆的最少切割次数

文章目录

  • Minimum Cuts to Divide a Circle 分割圆的最少切割次数
    • 问题描述:
    • 分析
    • 代码

Minimum Cuts to Divide a Circle 分割圆的最少切割次数

问题描述:

圆内一个 有效切割 ,符合以下二者之一:

  • 该切割是两个端点在圆上的线段,且该线段经过圆心。
  • 该切割是一端在圆心另一端在圆上的线段。

n范围[1,100]

分析

这个问题来源于week test,当时花了10min,为了求稳,这种看似简单的问题,往往都有些陷阱。
整个问题有点像切蛋糕,注意仅仅是像,要求把圆进行分割,而且是n等分。
给出了2个合法的分割方式,即都必须过圆心,也就是直径或者半径。
利用小学数学,对于偶数来说很容易完成等分,也就是常见的一刀两断,所以n为 e v e n even even时,分割 n / 2 n/2 n/2次。但是对于奇数1,3,5,7,9,这个方法就不行了。
首先对于1 来说,完全不需要分割,都是我的,但是3,5…等奇数,就必须分割,以3为例,平均3等分,很明显是3个半径分割,每个角度 360 / 3 = 120 360/3=120 360/3=120,如果是5等分,那么就是5个半径分割,其他的方案分割,不可能比这种方案更加优秀。
所以规律基本就出现了,对于 e v e n even even时,分割 n / 2 n/2 n/2,对于 o d d odd odd时, n = = 1 , 分割 0 次 n==1,分割0次 n==1,分割0 n > 1 时,分割 n 次 n>1时,分割n次 n>1时,分割n.
虽然奇数分割的情况下,可能有余数,但是理论上确实是等分的。
而需要注意的是n是可以取到1的。所以你懂得。

代码

public int numberOfCuts(int n) { 
        if(n==1||n%2==0) return n/2;
        return n;
    }

时间复杂度 O ( 1 ) 时间复杂度 O(1) 时间复杂度O(1)
空间复杂度 O ( 1 ) 空间复杂度 O(1) 空间复杂度O(1)

public int numberOfCuts(int n) { 
      return (n==1||n%2==0)?n/2:n; 
  }

时间复杂度 O ( 1 ) 时间复杂度 O(1) 时间复杂度O(1)
空间复杂度 O ( 1 ) 空间复杂度 O(1) 空间复杂度O(1)

Tag

Geometry Math

你可能感兴趣的:(数据结构与算法,算法)