leetcode刷题---排序(简单组)

排序

242.有效的字母异位词
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。

示例 1:
输入: s = “anagram”, t = “nagaram”
输出: true
示例 2:
输入: s = “rat”, t = “car”
输出: false
说明:
你可以假设字符串只包含小写字母。

class Solution {
    public boolean isAnagram(String s, String t) {
        char[] s1=s.toCharArray();;
        char[] s2=t.toCharArray();
        Arrays.sort(s1);
        Arrays.sort(s2);
        return String.valueOf(s1).equals(String.valueOf(s2));
       
    }
    
}
  1. 按奇偶排序数组 II
    给定一个非负整数数组 A, A 中一半整数是奇数,一半整数是偶数。
    对数组进行排序,以便当 A[i] 为奇数时,i 也是奇数;当 A[i] 为偶数时, i 也是偶数。
    你可以返回任何满足上述条件的数组作为答案。

示例:
输入:[4,2,5,7]
输出:[4,5,2,7]
解释:[4,7,2,5],[2,5,4,7],[2,7,4,5] 也会被接受。

提示:
2 <= A.length <= 20000
A.length % 2 == 0
0 <= A[i] <= 1000

class Solution {
    public int[] sortArrayByParityII(int[] A) {
        int n=A.length;
        for(int i=0,j=1;i<n&&j<n;){
           while(i<n&&(A[i]%2==0)) i+=2;
           while(j<n&&(A[j]%2!=0)) j+=2;
           if(i<n&&j<n){
               int t=A[i];
               A[i]=A[j];
               A[j]=t;
           }
        }
        return A;
    }
}
  1. 数组的相对排序
    给你两个数组,arr1 和 arr2,
    arr2 中的元素各不相同
    arr2 中的每个元素都出现在 arr1 中
    对 arr1 中的元素进行排序,使 arr1 中项的相对顺序和 arr2 中的相对顺序相同。未在 arr2 中出现过的元素需要按照升序放在 arr1 的末尾。

示例:
输入:arr1 = [2,3,1,3,2,4,6,7,9,2,19], arr2 = [2,1,4,3,9,6]
输出:[2,2,2,1,4,3,3,9,6,7,19]

提示:
arr1.length, arr2.length <= 1000
0 <= arr1[i], arr2[i] <= 1000
arr2 中的元素 arr2[i] 各不相同
arr2 中的每个元素 arr2[i] 都出现在 arr1 中

class Solution {
    public int[] relativeSortArray(int[] arr1, int[] arr2) {
         int[] nums = new int[1001];
        int[] res = new int[arr1.length];
        //遍历arr1,统计每个元素的数量
        for (int i : arr1) {
            nums[i]++;
        }
        //遍历arr2,处理arr2中出现的元素
        int index = 0;
        for (int i : arr2) {
            while (nums[i]>0){
                res[index++] = i;
                nums[i]--;
            }
        }
        //遍历nums,处理剩下arr2中未出现的元素
        for (int i = 0; i < nums.length; i++) {
            while (nums[i]>0){
                res[index++] = i;
                nums[i]--;
            }
        }
        return res;
    }
}
  1. 距离顺序排列矩阵单元格
    给出 R 行 C 列的矩阵,其中的单元格的整数坐标为 (r, c),满足 0 <= r < R 且 0 <= c < C。
    另外,我们在该矩阵中给出了一个坐标为 (r0, c0) 的单元格。
    返回矩阵中的所有单元格的坐标,并按到 (r0, c0) 的距离从最小到最大的顺序排,其中,两单元格(r1, c1) 和 (r2, c2) 之间的距离是曼哈顿距离,|r1 - r2| + |c1 - c2|。(你可以按任何满足此条件的顺序返回答案。)

示例 1:
输入:R = 1, C = 2, r0 = 0, c0 = 0
输出:[[0,0],[0,1]]
解释:从 (r0, c0) 到其他单元格的距离为:[0,1]

示例 2:
输入:R = 2, C = 2, r0 = 0, c0 = 1
输出:[[0,1],[0,0],[1,1],[1,0]]
解释:从 (r0, c0) 到其他单元格的距离为:[0,1,1,2]
[[0,1],[1,1],[0,0],[1,0]] 也会被视作正确答案。

示例 3:
输入:R = 2, C = 3, r0 = 1, c0 = 2
输出:[[1,2],[0,2],[1,1],[0,1],[1,0],[0,0]]
解释:从 (r0, c0) 到其他单元格的距离为:[0,1,1,2,2,3]
其他满足题目要求的答案也会被视为正确,例如 [[1,2],[1,1],[0,2],[1,0],[0,1],[0,0]]。

提示:
1 <= R <= 100
1 <= C <= 100
0 <= r0 < R
0 <= c0 < C

class Solution {
    public int[][] allCellsDistOrder(int R, int C, int r0, int c0) {
         int[][] res = new int[R*C][2];
        int index = 0;
    	for(int i = 0 ; i < R ; i ++)
        	for(int j = 0 ; j < C ; j ++) {
        		int[] xy = {i,j};
        		res[index++] = xy;
        	}
    	Arrays.sort(res, new Comparator<int[]>() {
			@Override
			public int compare(int[] o1, int[] o2) {
				int dis1 = Math.abs(o1[0]-r0)+Math.abs(o1[1]-c0);
				int dis2 = Math.abs(o2[0]-r0)+Math.abs(o2[1]-c0);
				return dis1 - dis2;
			}
		});
    	return res;
    }
}
  1. 三角形的最大周长
    给定由一些正数(代表长度)组成的数组 A,返回由其中三个长度组成的、面积不为零的三角形的最大周长。
    如果不能形成任何面积不为零的三角形,返回 0。

示例 1:
输入:[2,1,2]
输出:5

示例 2:
输入:[1,2,1]
输出:0

示例 3:
输入:[3,2,3,4]
输出:10

示例 4:
输入:[3,6,2,3]
输出:8

提示:
3 <= A.length <= 10000
1 <= A[i] <= 10^6

class Solution {
    public int largestPerimeter(int[] A) {
        Arrays.sort(A);
        for(int i=A.length-1;i>=2;i--){
            int s1=A[i];
            int s2=A[i-1];
            int s3=A[i-2];
            if(s1<s2+s3){
                return s1+s2+s3;
            }
        }
        return 0;
    }
}
  1. 两个数组的交集
    给定两个数组,编写一个函数来计算它们的交集。
    示例 1:
    输入: nums1 = [1,2,2,1], nums2 = [2,2]
    输出: [2]
    示例 2:
    输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
    输出: [9,4]
    说明:
    输出结果中的每个元素一定是唯一的。
    我们可以不考虑输出结果的顺序。
class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        ArrayList<Integer> list=new ArrayList<>();
        HashSet<Integer> set=new HashSet<>();
        for(int i=0;i<nums1.length;i++){
            set.add(nums1[i]);
        }

        for(int i=0;i<nums2.length;i++){
            if(set.contains(nums2[i])){
                list.add(nums2[i]);
                set.remove(nums2[i]);
            }
        }

        int [] str=new int [list.size()];
        for(int i=0;i<list.size();i++){
            str[i]=list.get(i);
        }
        return str;
    }
}
  1. 两个数组的交集 II
    给定两个数组,编写一个函数来计算它们的交集。
    示例 1:
    输入: nums1 = [1,2,2,1], nums2 = [2,2]
    输出: [2,2]

示例 2:
输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出: [4,9]

说明:
输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致。
我们可以不考虑输出结果的顺序。

class Solution {
    public int[] intersect(int[] nums1, int[] nums2) {
        ArrayList<Integer> set=new ArrayList<>();
        ArrayList<Integer> res=new ArrayList<>();
        for(int n:nums1){
            set.add(n);
        }
        for(int n:nums2){
            if(set.contains(n)){
                res.add(n);
                set.remove(Integer.valueOf(n));
            }
        }
        int [] num=new int[res.size()];
        int t=0;
        for(int n:res){
            num[t++]=n;
        }
        return num;
    }
}

你可能感兴趣的:(leetcode,算法,排序,排序简单组,刷题)