718. 最长重复子数组
class Solution {
public int findLength(int[] A
, int[] B
) {
if(A
.length
== 0 || B
.length
== 0){
return 0;
}
int m
= A
.length
;
int n
= B
.length
;
int[][] dp
= new int[m
+1][n
+1];
dp
[0][0] = 0;
int res
= 0;
for(int i
= 1;i
<= m
;i
++) {
for(int j
= 1; j
<= n
;j
++) {
if(A
[i
-1]==B
[j
-1]){
dp
[i
][j
] = dp
[i
-1][j
-1] + 1;
}
res
= Math
.max(res
,dp
[i
][j
]);
}
}
return res
;
}
}
class Solution {
public int findLength(int[] A
, int[] B
) {
return A
.length
< B
.length
? findMax(A
, B
) : findMax(B
, A
);
}
int findMax(int[] A
, int[] B
) {
int max
= 0;
int an
= A
.length
, bn
= B
.length
;
for(int len
=1; len
<= an
; len
++) {
max
= Math
.max(max
, maxLen(A
, 0, B
, bn
- len
, len
));
}
for(int j
=bn
-an
; j
>= 0;j
--) {
max
= Math
.max(max
, maxLen(A
, 0, B
, j
, an
));
}
for(int i
=1;i
<an
;i
++) {
max
= Math
.max(max
, maxLen(A
, i
, B
, 0, an
- i
));
}
return max
;
}
int maxLen(int[] a
, int i
, int[] b
, int j
, int len
) {
int count
= 0, max
= 0;
for(int k
= 0; k
< len
; k
++) {
if(a
[i
+k
] == b
[j
+k
]) {
count
++;
} else if(count
> 0) {
max
= Math
.max(max
, count
);
count
= 0;
}
}
return count
> 0 ? Math
.max(max
, count
) : max
;
}
}
43. 字符串相乘
class Solution {
public String
multiply(String num1
, String num2
) {
if (num1
.equals("0") || num2
.equals("0")) {
return "0";
}
String res
= "0";
for (int i
= num2
.length() - 1; i
>= 0; i
--) {
int carry
= 0;
StringBuilder temp
= new StringBuilder();
for (int j
= 0; j
< num2
.length() - 1 - i
; j
++) {
temp
.append(0);
}
int n2
= num2
.charAt(i
) - '0';
for (int j
= num1
.length() - 1; j
>= 0 || carry
!= 0; j
--) {
int n1
= j
< 0 ? 0 : num1
.charAt(j
) - '0';
int product
= (n1
* n2
+ carry
) % 10;
temp
.append(product
);
carry
= (n1
* n2
+ carry
) / 10;
}
res
= addStrings(res
, temp
.reverse().toString());
}
return res
;
}
public String
addStrings(String num1
, String num2
) {
StringBuilder builder
= new StringBuilder();
int carry
= 0;
for (int i
= num1
.length() - 1, j
= num2
.length() - 1;
i
>= 0 || j
>= 0 || carry
!= 0;
i
--, j
--) {
int x
= i
< 0 ? 0 : num1
.charAt(i
) - '0';
int y
= j
< 0 ? 0 : num2
.charAt(j
) - '0';
int sum
= (x
+ y
+ carry
) % 10;
builder
.append(sum
);
carry
= (x
+ y
+ carry
) / 10;
}
return builder
.reverse().toString();
}
}
class Solution {
public String
multiply(String num1
, String num2
) {
int n1
= num1
.length()-1;
int n2
= num2
.length()-1;
if(n1
< 0 || n2
< 0) return "";
int[] mul
= new int[n1
+n2
+2];
for(int i
= n1
; i
>= 0; --i
) {
for(int j
= n2
; j
>= 0; --j
) {
int bitmul
= (num1
.charAt(i
)-'0') * (num2
.charAt(j
)-'0');
bitmul
+= mul
[i
+j
+1];
mul
[i
+j
] += bitmul
/ 10;
mul
[i
+j
+1] = bitmul
% 10;
}
}
StringBuilder sb
= new StringBuilder();
int i
= 0;
while(i
< mul
.length
-1 && mul
[i
] == 0)
i
++;
for(; i
< mul
.length
; ++i
)
sb
.append(mul
[i
]);
return sb
.toString();
}
}
54. 螺旋矩阵
class Solution {
public List
<Integer> spiralOrder(int[][] matrix
) {
List
<Integer> list
= new ArrayList<>();
if(matrix
== null
|| matrix
.length
== 0) return list
;
int l
= 0,r
= matrix
[0].length
-1,t
= 0,b
= matrix
.length
-1;
while(true){
for(int i
= l
;i
<= r
;i
++) list
.add(matrix
[t
][i
]);
if(++t
> b
) break;
for(int i
= t
;i
<= b
;i
++) list
.add(matrix
[i
][r
]);
if(--r
< l
) break;
for(int i
= r
;i
>= l
;i
--) list
.add(matrix
[b
][i
]);
if(--b
< t
) break;
for(int i
= b
;i
>= t
;i
--) list
.add(matrix
[i
][l
]);
if(++l
> r
) break;
}
return list
;
}
}
你知道的越多,你不知道的越多。
转载请注明原文地址:https://ipadbbs.8miu.com/read-5791.html