38
38
39
39
<!-- 这里可写通用的实现逻辑 -->
40
40
41
- 二分法。
41
+ ** 1. 二分查找**
42
+
43
+ ** 2. 转换为数学问题**
44
+
45
+ 由于 ` n² = 1 + 3 + 5 + ... + (2n-1) ` ,对数字 num 不断减去 i (` i = 1, 3, 5, ... ` ) 直至 num 不大于 0,如果最终 num 等于 0,说明是一个有效的完全平方数。
42
46
43
47
<!-- tabs:start -->
44
48
@@ -51,25 +55,35 @@ class Solution:
51
55
def isPerfectSquare (self , num : int ) -> bool :
52
56
left, right = 1 , num
53
57
while left < right:
54
- mid = left + (( right - left ) >> 1 )
55
- if num // mid <= mid :
58
+ mid = ( left + right) >> 1
59
+ if mid * mid >= num :
56
60
right = mid
57
61
else :
58
62
left = mid + 1
59
63
return left * left == num
60
64
```
61
65
66
+ ``` python
67
+ class Solution :
68
+ def isPerfectSquare (self , num : int ) -> bool :
69
+ i = 1
70
+ while num > 0 :
71
+ num -= i
72
+ i += 2
73
+ return num == 0
74
+ ```
75
+
62
76
### ** Java**
63
77
64
78
<!-- 这里可写当前语言的特殊实现逻辑 -->
65
79
66
80
``` java
67
81
class Solution {
68
82
public boolean isPerfectSquare (int num ) {
69
- int left = 1 , right = num;
83
+ long left = 1 , right = num;
70
84
while (left < right) {
71
- int mid = (left + right) >>> 1 ;
72
- if (num / mid <= mid ) {
85
+ long mid = (left + right) >>> 1 ;
86
+ if (mid * mid >= num ) {
73
87
right = mid;
74
88
} else {
75
89
left = mid + 1 ;
@@ -80,34 +94,53 @@ class Solution {
80
94
}
81
95
```
82
96
97
+ ``` java
98
+ class Solution {
99
+ public boolean isPerfectSquare (int num ) {
100
+ for (int i = 1 ; num > 0 ; i += 2 ) {
101
+ num -= i;
102
+ }
103
+ return num == 0 ;
104
+ }
105
+ }
106
+ ```
107
+
83
108
### ** C++**
84
109
85
110
``` cpp
86
111
class Solution {
87
112
public:
88
113
bool isPerfectSquare(int num) {
89
114
long left = 1, right = num;
90
- while (left < right) {
91
- int mid = left + ((right - left) >> 1);
92
- if (num / mid <= mid) {
93
- right = mid;
94
- } else {
95
- left = mid + 1;
96
- }
115
+ while (left < right)
116
+ {
117
+ long mid = left + right >> 1;
118
+ if (mid * mid >= num) right = mid;
119
+ else left = mid + 1;
97
120
}
98
121
return left * left == num;
99
122
}
100
123
};
101
124
```
102
125
126
+ ```cpp
127
+ class Solution {
128
+ public:
129
+ bool isPerfectSquare(int num) {
130
+ for (int i = 1; num > 0; i += 2) num -= i;
131
+ return num == 0;
132
+ }
133
+ };
134
+ ```
135
+
103
136
### ** Go**
104
137
105
138
``` go
106
139
func isPerfectSquare (num int ) bool {
107
140
left , right := 1 , num
108
141
for left < right {
109
- mid := left + ( right-left)>> 1
110
- if num/ mid <= mid {
142
+ mid := ( left + right) >> 1
143
+ if mid*mid >= num {
111
144
right = mid
112
145
} else {
113
146
left = mid + 1
@@ -117,6 +150,15 @@ func isPerfectSquare(num int) bool {
117
150
}
118
151
```
119
152
153
+ ``` go
154
+ func isPerfectSquare (num int ) bool {
155
+ for i := 1 ; num > 0 ; i += 2 {
156
+ num -= i
157
+ }
158
+ return num == 0
159
+ }
160
+ ```
161
+
120
162
### ** ...**
121
163
122
164
```
0 commit comments