378. 有序矩阵中第K小的元素
class Solution {
public int kthSmallest(int[][] matrix
, int k
) {
int rows
= matrix
.length
, columns
= matrix
[0].length
;
int[] sorted
= new int[rows
* columns
];
int index
= 0;
for (int[] row
: matrix
) {
for (int num
: row
) {
sorted
[index
++] = num
;
}
}
Arrays
.sort(sorted
);
return sorted
[k
- 1];
}
}
class Solution {
public int kthSmallest(int[][] matrix
, int k
) {
PriorityQueue
<int[]> pq
= new PriorityQueue<int[]>((a
,b
) -> a
[0] - b
[0]);
int n
= matrix
.length
;
for (int i
= 0; i
< n
; i
++) {
pq
.offer(new int[]{matrix
[i
][0], i
, 0});
}
for (int i
= 0; i
< k
- 1; i
++) {
int[] now
= pq
.poll();
if (now
[2] != n
- 1) {
pq
.offer(new int[]{matrix
[now
[1]][now
[2] + 1], now
[1], now
[2] + 1});
}
}
return pq
.poll()[0];
}
}
class Solution {
public int kthSmallest(int[][] matrix
, int k
) {
int n
= matrix
.length
;
int left
= matrix
[0][0];
int right
= matrix
[n
- 1][n
- 1];
while (left
< right
) {
int mid
= left
+ ((right
- left
) >> 1);
if (check(matrix
, mid
, k
, n
)) {
right
= mid
;
} else {
left
= mid
+ 1;
}
}
return left
;
}
public boolean check(int[][] matrix
, int mid
, int k
, int n
) {
int i
= n
- 1;
int j
= 0;
int num
= 0;
while (i
>= 0 && j
< n
) {
if (matrix
[i
][j
] <= mid
) {
num
+= i
+ 1;
j
++;
} else {
i
--;
}
}
return num
>= k
;
}
}
29. 两数相除
class Solution {
public int divide(int dividend
, int divisor
) {
if (dividend
== 0) {
return 0;
}
if (dividend
== Integer
.MIN_VALUE
&& divisor
== -1) {
return Integer
.MAX_VALUE
;
}
boolean negative
;
negative
= (dividend
^ divisor
) < 0;
long t
= Math
.abs((long) dividend
);
long d
= Math
.abs((long) divisor
);
int result
= 0;
for (int i
=31; i
>=0;i
--) {
if ((t
>>i
)>=d
) {
result
+= 1<<i
;
t
-= d
<<i
;
}
}
return negative
? -result
: result
;
}
}
371. 两整数之和
class Solution {
public int getSum(int a
, int b
) {
int sum
,carry
;
sum
= a
^b
;
carry
= (a
&b
)<<1;
if(carry
!=0){
return getSum(sum
,carry
);
}
return sum
;
}
}
class Solution {
public int getSum(int a
, int b
) {
if (a
==0) return b
;
if (b
==0) return a
;
int lower
;
int carrier
;
while (true) {
lower
= a
^b
;
carrier
= a
&b
;
if (carrier
==0) break;
a
= lower
;
b
= carrier
<<1;
}
return lower
;
}
}
你知道的越多,你不知道的越多。
转载请注明原文地址:https://ipadbbs.8miu.com/read-26273.html