1. 两数之和
java解决方法:
class Solution {
public int[] twoSum(int[] nums, int target) {
int[] arr = new int[2];
for(int i = 0; i < nums.length; i++)
{
for(int i1 = i + 1; i1 < nums.length; i1++)
{
if(nums[i] + nums[i1] == target)
{
arr[0] = i;
arr[1] = i1;
return arr;
}
}
}
return arr;
}
}
输入:
[2,7,11,15]
9
输出:[0,1]
public class Main {
public static int[] stringToIntegerArray(String input) {
input = input.trim();
input = input.substring(1, input.length() - 1);
if (input.length() == 0) {
return new int[0];
}
String[] parts = input.split(",");
int[] output = new int[parts.length];
for(int index = 0; index < parts.length; index++) {
String part = parts[index].trim();
output[index] = Integer.parseInt(part);
}
return output;
}
public static String integerArrayToString(int[] nums, int length) {
if (length == 0) {
return "[]";
}
String result = "";
for(int index = 0; index < length; index++) {
int number = nums[index];
result += Integer.toString(number) + ", ";
}
return "[" + result.substring(0, result.length() - 2) + "]";
}
public static String integerArrayToString(int[] nums) {
return integerArrayToString(nums, nums.length);
}
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String line;
while ((line = in.readLine()) != null) {
int[] nums = stringToIntegerArray(line);
line = in.readLine();
int target = Integer.parseInt(line);
int[] ret = new Solution().twoSum(nums, target);
String out = integerArrayToString(ret);
System.out.print(out);
}
}
}
11. 盛水最多的容器
java解决方法:
class Solution {
public int maxArea(int[] height) {
// 每次移动两端的较短的那一条,不可能移动长的那一条,有可能找到更大的.
int start = 0;
int end = height.length - 1;
int maxA = 0;
while(start < end)
{
int s = 0;
if(height[start] > height[end])
{
s = height[end] * (end - start);
if(s > maxA)
{
maxA = s;
}
end--;
}
else
{
s = height[start] * (end - start);
if(s > maxA)
{
maxA = s;
}
start++;
}
}
return maxA;
}
}
输入:
[1,8,6,2,5,4,8,3,7]
输出:
49
public class MainClass {
public static int[] stringToIntegerArray(String input) {
input = input.trim();
input = input.substring(1, input.length() - 1);
if (input.length() == 0) {
return new int[0];
}
String[] parts = input.split(",");
int[] output = new int[parts.length];
for(int index = 0; index < parts.length; index++) {
String part = parts[index].trim();
output[index] = Integer.parseInt(part);
}
return output;
}
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String line;
while ((line = in.readLine()) != null) {
int[] height = stringToIntegerArray(line);
int ret = new Solution().maxArea(height);
String out = String.valueOf(ret);
System.out.print(out);
}
}
}
15. 三数之和
java解决方法:
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
Arrays.sort(nums);
List<List<Integer>> Li = new ArrayList<List<Integer>>();
for(int i1 = 0; i1 < nums.length; i1++)
{
int start = i1 + 1;
int end = nums.length - 1;
while(start < end)
{
if(nums[i1] + nums[start] + nums[end] == 0)
{
List<Integer> li = new ArrayList<Integer>();
li.add(nums[i1]);
li.add(nums[start]);
li.add(nums[end]);
//不能有重复的三元组
Li.add(li);
int a = nums[start];
int b = nums[end];
while(start < nums.length && a == nums[start])
{
start++;
}
while(end > start && b == nums[end])
{
end--;
}
}
else if(nums[i1] + nums[start] + nums[end] < 0)
{
int a = nums[start];
while(start < nums.length && a == nums[start])
{
start++;
}
}
else
{
int b = nums[end];
while(end > start && b == nums[end])
{
end--;
}
}
}
int A = nums[i1];
while(i1 + 1 < nums.length && A == nums[i1 + 1])
{
i1++;
}
}
return Li;
}
}
输入:[-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
public class MainClass {
public static int[] stringToIntegerArray(String input) {
input = input.trim();
input = input.substring(1, input.length() - 1);
if (input.length() == 0) {
return new int[0];
}
String[] parts = input.split(",");
int[] output = new int[parts.length];
for(int index = 0; index < parts.length; index++) {
String part = parts[index].trim();
output[index] = Integer.parseInt(part);
}
return output;
}
public static String integerArrayListToString(List<Integer> nums, int length) {
if (length == 0) {
return "[]";
}
String result = "";
for(int index = 0; index < length; index++) {
Integer number = nums.get(index);
result += Integer.toString(number) + ", ";
}
return "[" + result.substring(0, result.length() - 2) + "]";
}
public static String integerArrayListToString(List<Integer> nums) {
return integerArrayListToString(nums, nums.size());
}
public static String int2dListToString(List<List<Integer>> nums) {
StringBuilder sb = new StringBuilder("[");
for (List<Integer> list: nums) {
sb.append(integerArrayListToString(list));
sb.append(",");
}
sb.setCharAt(sb.length() - 1, ']');
return sb.toString();
}
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String line;
while ((line = in.readLine()) != null) {
int[] nums = stringToIntegerArray(line);
List<List<Integer>> ret = new Solution().threeSum(nums);
String out = int2dListToString(ret);
System.out.print(out);
}
}
}
26. 删除有序数组中的重复项
java解决方法:
class Solution {
public int removeDuplicates(int[] nums) {
int i = 0;
int count = 0;
while(i < nums.length)
{
int a = nums[i];
nums[count] = a;
count++;
while(i < nums.length && a == nums[i])
{
i++;
}
}
return count;
}
}
33. 搜索旋转排序数组
java解决方法:
import java.io.*;
class Solution {
public int search(int[] nums, int target) {
int l = 0;
int r = nums.length - 1;
while(l <= r)
{
int mid = (l + r) / 2;
if(nums[mid] == target)
{
return mid;
}
if(nums[0] > nums[mid])
{
if(nums[0] > target && target > nums[mid])
{
l = mid + 1;
}
else
{
r = mid - 1;
}
}
else
{
if(nums[0] <= target && target < nums[mid])
{
r = mid - 1;
}
else
{
l = mid + 1;
}
}
}
return -1;
}
}
public class Main{
public static int[] stringToIntegerArray(String input) {
input = input.trim();
input = input.substring(1, input.length() - 1);
if (input.length() == 0) {
return new int[0];
}
String[] parts = input.split(",");
int[] output = new int[parts.length];
for(int index = 0; index < parts.length; index++) {
String part = parts[index].trim();
output[index] = Integer.parseInt(part);
}
return output;
}
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String line;
while ((line = in.readLine()) != null) {
int[] nums = stringToIntegerArray(line);
line = in.readLine();
int target = Integer.parseInt(line);
int ret = new Solution().search(nums, target);
String out = String.valueOf(ret);
System.out.print(out);
}
}
}
34. 在排序数组中查找元素的第一个和最后一个位
java解决方法:
import java.io.*;
class Solution {
public int[] searchRange(int[] nums, int target) {
int start = 0;
int end = nums.length - 1;
int index = -1;
int[] arr = new int[2];
while(start <= end)
{
int mid = (start + end) / 2;
if(nums[mid] == target)
{
index = mid;
break;
}
else if(nums[mid] > target)
{
end = mid - 1;
}
else
{
start = mid + 1;
}
}
if(index == -1)
{
arr[0] = -1;
arr[1] = -1;
return arr;
}
else
{
int index1 = index;
int index2 = index;
while(index1 >= 0 && nums[index1] == target)
{
index1--;
}
while(index2 < nums.length && nums[index2] == target)
{
index2++;
}
arr[0] = index1 + 1;
arr[1] = index2 - 1;;
return arr;
}
}
}
public class Main {
public static int[] stringToIntegerArray(String input) {
input = input.trim();
input = input.substring(1, input.length() - 1);
if (input.length() == 0) {
return new int[0];
}
String[] parts = input.split(",");
int[] output = new int[parts.length];
for(int index = 0; index < parts.length; index++) {
String part = parts[index].trim();
output[index] = Integer.parseInt(part);
}
return output;
}
public static String integerArrayToString(int[] nums, int length) {
if (length == 0) {
return "[]";
}
String result = "";
for(int index = 0; index < length; index++) {
int number = nums[index];
result += Integer.toString(number) + ", ";
}
return "[" + result.substring(0, result.length() - 2) + "]";
}
public static String integerArrayToString(int[] nums) {
return integerArrayToString(nums, nums.length);
}
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String line;
while ((line = in.readLine()) != null) {
int[] nums = stringToIntegerArray(line);
line = in.readLine();
int target = Integer.parseInt(line);
int[] ret = new Solution().searchRange(nums, target);
String out = integerArrayToString(ret);
System.out.print(out);
}
}
}
输入:
[5,7,7,8,8,10]
8
输出:
[3,4]
36. 有效的数独
判断是否有效有三个条件:
-
同一个数字在每一行只能出现一次;
-
同一个数字在每一列只能出现一次;
-
同一个数字在每一个小九宫格只能出现一次。
java解题方法:
class Solution {
public boolean isValidSudoku(char[][] board) {
//row 第一维表示第几行,第二维表示第几个数字
int[][] row = new int[9][9];
int[][] col = new int[9][9];
int[][][] subbox = new int[3][3][9];
for(int i = 0; i < 9; i++)
{
for(int j = 0; j < 9; j++)
{
char c = board[i][j];
if(c != '.')
{
// 第几个数字
int n = c - '0' - 1;
row[i][n]++;
col[j][n]++;
subbox[i / 3][j / 3][n]++;
if(row[i][n] > 1 || col[j][n] > 1 || subbox[i / 3][j / 3][n] > 1)
{
return false;
}
}
}
}
return true;
}
}
46. 全排列
这个题主要采用回溯法。
Java解决方法:
class Solution {
public List<List<Integer>> permute(int[] nums) {
// 回溯法
List<List<Integer>> ans = new ArrayList<List<Integer>>();
int len = nums.length;
int[] visited = new int[len];
backtrack(ans,nums,new ArrayList<Integer>(),visited);
return ans;
}
private void backtrack( List<List<Integer>> ans,int[] nums,ArrayList<Integer> tmp,int[] visited)
{
if(tmp.size() == nums.length){
ans.add(new ArrayList<>(tmp));
return;
}
for(int i = 0; i < nums.length; i++)
{
if(visited[i] == 1)
{
continue;
}
else
{
tmp.add(nums[i]);
visited[i] = 1;
backtrack(ans,nums,tmp,visited);
// 回溯的关键
tmp.remove(tmp.size() - 1);
visited[i] = 0;
}
}
}
}
public class MainClass {
public static int[] stringToIntegerArray(String input) {
input = input.trim();
input = input.substring(1, input.length() - 1);
if (input.length() == 0) {
return new int[0];
}
String[] parts = input.split(",");
int[] output = new int[parts.length];
for(int index = 0; index < parts.length; index++) {
String part = parts[index].trim();
output[index] = Integer.parseInt(part);
}
return output;
}
public static String integerArrayListToString(List<Integer> nums, int length) {
if (length == 0) {
return "[]";
}
String result = "";
for(int index = 0; index < length; index++) {
Integer number = nums.get(index);
result += Integer.toString(number) + ", ";
}
return "[" + result.substring(0, result.length() - 2) + "]";
}
public static String integerArrayListToString(List<Integer> nums) {
return integerArrayListToString(nums, nums.size());
}
public static String int2dListToString(List<List<Integer>> nums) {
StringBuilder sb = new StringBuilder("[");
for (List<Integer> list: nums) {
sb.append(integerArrayListToString(list));
sb.append(",");
}
sb.setCharAt(sb.length() - 1, ']');
return sb.toString();
}
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String line;
while ((line = in.readLine()) != null) {
int[] nums = stringToIntegerArray(line);
List<List<Integer>> ret = new Solution().permute(nums);
String out = int2dListToString(ret);
System.out.print(out);
}
}
}
输入:
[1,2,3]
输出:
[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]