LeetCode Day9

60. 第k个排列
难度:中等
给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列。
按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下:
“123”
“132”
“213”
“231”
“312”
“321”
给定 n 和 k,返回第 k 个排列。
说明:
给定 n 的范围是 [1, 9]。
给定 k 的范围是[1, n!]。
示例 1:

输入: n = 3, k = 3
输出: "213"

示例 2:

输入: n = 4, k = 9
输出: "2314"

解:
执行用时 : 2 ms, 在Permutation Sequence的Java提交中击败了99.92% 的用户
内存消耗 : 33.2 MB, 在Permutation Sequence的Java提交中击败了99.83% 的用户
思路:用回溯法应该会超时,因此找规律
Code:

class Solution {
    public String getPermutation(int n, int k) {
        if(n==1)
            return "1";
        
        int a=1;
        int arr[]=new int[n];
        arr[0]=1;
        arr[1]=2;
        
        for(int i=2;i<=n-1;++i){
            a*=i;
            arr[i]=i+1;
        }
        
        String result="";
        k-=1;
        for(int j=0;j<n;++j){
            result=result+arr[k/a];
            arr[k/a]=10;
            Arrays.sort(arr);
            k=k-k/a*a;
            if(a!=1)
            a=a/(n-1-j);
        }
        return result;
            
    }
}

876. 链表的中间结点
难度:简单
给定一个带有头结点 head 的非空单链表,返回链表的中间结点。
如果有两个中间结点,则返回第二个中间结点。
示例 1:

输入:[1,2,3,4,5]
输出:此列表中的结点 3 (序列化形式:[3,4,5])
返回的结点值为 3 。 (测评系统对该结点序列化表述是 [3,4,5])。
注意,我们返回了一个 ListNode 类型的对象 ans,这样:
ans.val = 3, ans.next.val = 4, ans.next.next.val = 5, 以及 ans.next.next.next = NULL.

示例 2:

输入:[1,2,3,4,5,6]
输出:此列表中的结点 4 (序列化形式:[4,5,6])
由于该列表有两个中间结点,值分别为 3 和 4,我们返回第二个结点。

解:
执行用时 : 0 ms, 在Middle of the Linked List的Java提交中击败了100.00% 的用户
内存消耗 : 33.9 MB, 在Middle of the Linked List的Java提交中击败了59.08% 的用户
思路:快慢指针
Code:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode middleNode(ListNode head) {
        ListNode slow=head;
        ListNode fast=head;
        while(true){
            if(fast.next!=null){
                slow=slow.next;
                fast=fast.next;
                if(fast.next!=null)
                    fast=fast.next;
                else
                    break;
                    
            }
            else
                break;
        }
        return slow;
    }
}

877. 石子游戏
难度:中等
亚历克斯和李用几堆石子在做游戏。偶数堆石子排成一行,每堆都有正整数颗石子 piles[i] 。
游戏以谁手中的石子最多来决出胜负。石子的总数是奇数,所以没有平局。
亚历克斯和李轮流进行,亚历克斯先开始。 每回合,玩家从行的开始或结束处取走整堆石头。 这种情况一直持续到没有更多的石子堆为止,此时手中石子最多的玩家获胜。
假设亚历克斯和李都发挥出最佳水平,当亚历克斯赢得比赛时返回 true ,当李赢得比赛时返回 false 。

示例:

输入:[5,3,4,5]
输出:true
解释:
亚历克斯先开始,只能拿前 5 颗或后 5 颗石子 。
假设他取了前 5 颗,这一行就变成了 [3,4,5] 。
如果李拿走前 3 颗,那么剩下的是 [4,5],亚历克斯拿走后 5 颗赢得 10 分。
如果李拿走后 5 颗,那么剩下的是 [3,4],亚历克斯拿走后 4 颗赢得 9 分。
这表明,取前 5 颗石子对亚历克斯来说是一个胜利的举动,所以我们返回 true 。

解:
执行用时 : 0 ms, 在Stone Game的Java提交中击败了100.00% 的用户
内存消耗 : 34.4 MB, 在Stone Game的Java提交中击败了89.53% 的用户
思路:先手不可能输,直接return true

class Solution {
    public boolean stoneGame(int[] piles) {
        return true;
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值