Leetcode Task06 完成43、46、53题目并打卡

043 字符串相乘

给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。

public class Solution {
 
	public String multiply(String num1, String num2) {
        int n1 = num1.length();
        int n2 = num2.length();
        char[] array1 = num1.toCharArray();
        char[] array2 = num2.toCharArray();
        if(array1[0] == '0' || array2[0] == '0') {
        	return "0";
        }
        String[] strings = new String[n2];
        for (int i = n2 - 1; i >= 0; i--) {
        	String string = "";
			int flag = 0;
			for (int j = n1 - 1; j >= 0; j--) {
				int num = (array1[j] - '0') * (array2[i] - '0');
				string += (num + flag) % 10;
				flag = (num + flag) / 10;
			}
			if(flag > 0) {
				string += flag;
			}
			strings[n2 - i - 1] = string;
		}
        String result = "";
        int flag = 0;
        for (int i = 0; i < strings[n2 - 1].length() + n2 - 1; i++) {
			int sum = 0;
			for (int j = 0; j < n2; j++) {
				if(i - j < strings[j].length() && i - j >= 0) {
					sum += strings[j].charAt(i - j) - '0';
				}
			}
			int num = (sum + flag) % 10;
			flag = (sum + flag) / 10;
			result = num + result;
			
		}
        if(flag > 0) {
        	result = flag + result;
        }
        return result;
    }
}

046 全排列

Given a collection of distinct integers, return all possible permutations.
给定⼀个没有重复数字的序列,返回其所有可能的全排列。

举例

Input: [1,2,3]
Output:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]

解题思路
求出⼀个数组的排列组合中的所有排列,⽤ DFS 深搜即可。

public class Solution {
 
	List<List<Integer>> listList;
	
	public List<List<Integer>> permute(int[] nums) {
		listList = new ArrayList<>();
		permute(nums, new ArrayList<>());
		return listList;
	}
	
	//we put the possible array in list, we are going to find next number
	private void permute(int[] nums, List<Integer> list) {
		int n = nums.length;
		if(list.size() == n) {
			listList.add(new ArrayList<>(list));
			return;
		}
		for (int i = 0; i < n; i++) {
			if(list.contains(nums[i])) {
				continue;
			}
			list.add(nums[i]);
			permute(nums, list);
			list.remove(list.size() - 1);
		}
	}
}

053 最大子序列和

Given an integer array nums , find the contiguous subarray (containing at least one number) which has the largest sum and return its sum.
给定⼀个整数数组 nums ,找到⼀个具有最⼤和的连续⼦数组(⼦数组最少包含⼀个元素),返回其最⼤和。

举例

Input: [-2,1,-3,4,-1,2,1,-5,4],
Output: 6
Explanation: [4,-1,2,1] has the largest sum = 6.

解题思路

  • 这⼀题可以⽤ DP 求解也可以不⽤ DP。
  • 题⽬要求输出数组中某个区间内数字之和最⼤的那个值。dp[i] 表示 [0,i] 区间内各个⼦区间和的最⼤值,状态转移⽅程是 dp[i] = nums[i] + dp[i-1] (dp[i-1] > 0) , dp[i] =nums[i] (dp[i-1] ≤ 0) 。
class Solution {
    public int maxSubArray(int[] nums) {
        int result = nums[0];
        int sum = 0;
        for (int num : nums) {
            if (sum >= 0) {
                sum += num;
            } else {
                sum = num;
            }
            result = Math.max(result, sum);
        }
        return result;
    }
}
posted @ 2021-01-17 19:42  Vincy_Lemon  阅读(37)  评论(0)    收藏  举报