leedcode精选TOP面试题_数组

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]]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

身影王座

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值